CentOS 7 Let’s Encrypt 免費 SSL/TLS 憑證 HTTPS 設置 for NGINX

在 CentOS 7 搭配 NGINX 來使用 Let's Encrypt 的免費 SSL/TLS 憑證,並使用 Certbot 來自動取得、部署和更新 SSL 憑證,在結合排程讓系統自動續期憑證。


Chrome 將在「http://…」上顯示安全性警告

Google 8 月寄的 Email 內容:

自 2017 年 10 月起,如果使用者使用Chrome (62 版) 時在HTTP 網頁的表單中輸入文字,或是在無痕模式下瀏覽HTTP 網頁,Chrome 將顯示「不安全」警告。

您網站中的下列網址包含文字輸入欄位(例如 <input type=”text”> 或 <input type=”email”>),將會觸發這項新的Chrome 警告。請查看這些示例,掌握這類警告出現的位置,方便您採取有助於保護使用者資料的行動。另外也請注意,我們並未逐一列出所有有問題的網址。

安裝軟體

安裝 EPEL 軟體擴充資源庫:

[root@img ~]# yum install epel-release

Let’s Encrypt 憑證取得方式不同與其它網站是在網頁上手動填寫申請資料的,而是須在 Server 上安裝一個 Client(python 寫的),這種作法所帶來的好處是可全自動化,這裡使用 Let’s Encrypt 官方推薦的 Certbot Client,來自動取得、部署和更新 SSL 憑證:

[root@img ~]# yum install certbot

申請憑證

設定方式可參考 Certbot 官網的教學,選擇符合的 HTTP 網頁伺服器和 OS。

有點看不太懂就是了…

certbot 首次申請 SSL 憑證:

憑證過期前會預先寄發郵件至填寫的 Email
certbot certonly --webroot -w [網站根目錄] -d [網站網址] -m [聯絡人 Email] --agree-tos
[root@img ~]# certbot certonly --webroot -w /var/nginx/html -d img.yummygo.com.tw -m eo-mis@hotel-tainan.com.tw --agree-tos
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:Y

證書儲存在:

  • ssl_certificate: /etc/letsencrypt/live/img.yummygo.com.tw/fullchain.pem;
  • ssl_certificate_key: /etc/letsencrypt/live/img.yummygo.com.tw/privkey.pem

NGINX 設定

NGINX SSL/TLS 設定:

可使用 Security/Server Side TLS – MozillaWiki 提供的介面,自動產生 Apache、NGINX HTTP 網頁伺服器的設定檔
[root@img ~]# vi /etc/nginx/conf.d/default.conf
... 以上省略 ...

server {
    # 使用 https 和 http/2 協定
    listen 443 ssl http2;
    # 上述的 IPv6 方式
    listen [::]:443 ssl http2;

    # 網站網址
    server_name img.yummygo.com.tw;
    # 網站根目錄
    root   /var/nginx/html;


    #
    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    #

    # SSL 憑證證書路徑
    ssl_certificate /etc/letsencrypt/live/img.yummygo.com.tw/fullchain.pem;
    # 私鑰路徑
    ssl_certificate_key /etc/letsencrypt/live/img.yummygo.com.tw/privkey.pem;
    # 緩存有效期
    ssl_session_timeout 1d;
    # 緩存憑證類型和大小
    ssl_session_cache shared:SSL:50m;


    #
    # intermediate configuration. tweak to your needs.
    #

    # 使用的加密協定
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 加密演算法,越前面的優先級越高
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    # 交握過程使用 Server 的首選加演算法,這裡使用 Client 為首選
    ssl_prefer_server_ciphers on;


    #
    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    #

    # 增加 http header
    add_header Strict-Transport-Security max-age=15768000;
}

重新載入 NGINX 設定:

[root@img ~]# systemctl reload nginx

防火牆設定

設定 firewall 允許 https service(Posr 443):

[root@img ~]# firewall-cmd --permanent --add-service=https --zone=public
[root@img ~]# firewall-cmd --reload

自動續期憑證

Let’s Encrypt 免費 SSL/TLS 憑證有效期僅有三個月,因此設定排程來自動續期:

[root@img ~]# vi /etc/crontab
# 每月 1 日 03:00 續期憑證,並重啟 Nginx
00 03  1  *  * root /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

Chrome Browser 安全狀態

如果加上 SSL/TLS 憑證後 Chrome Browser 網址列仍顯示 “!” 圖示,表示在該網頁中使用了非 HTTPS 的連結,Chrome Browser 安全判定,大致會有以下四種狀況:

  • 全站 HTTPS,且都使用合法的 SSL/TLS 憑證。

  • 使用合法的 SSL/TLS 憑證,但網頁中使用了非 HTTPS 的連結。

  • 網站使用不合法的 SSL/TLS 憑證。

  • 網站無使用 HTTPS(使用 HTTP 瀏覽)


3 則評論 to “CentOS 7 Let’s Encrypt 免費 SSL/TLS 憑證 HTTPS 設置 for NGINX”

  1. 林朝群 說:

    站長您好,

    從您的網站中讓我得到了很多有用的資訊,在此先謝謝您的無私分享。
    因最近也想架一個WordPress網站來記錄自己工作上的經驗,同時我也很喜歡您這個網站的佈景風格,讓人很容易方便閱讀。
    所以很冒昧的想請問一下,不知您願不願意分享這個網站的佈景主題給我?
    或者您是否有意願出售這個佈景主題?

    因為在網站上找不到連絡您的方式,所以冒味的在此留言,如有造成您的困擾,敬請見諒。

    • SmallJacky 說:

      能夠直接分享給您,只是該佈景為完全自己手工與首次建立,所以 Code 不是撰寫的很好,而且也不是很方便就是,您需再自行調整。

      您所留的 EMail 是否正確?
      我在寄給您。

發表迴響