跳至主要内容

[Nginx] 手動 Let's Encrypt SSL 憑證與設定

在 Google, Apple 等科技巨頭主導下, HTTPS 已成網站服務必備. 而合格 https CA 憑證的申請是要費用的, 因此出現 Let's Encrypt 這樣的服務. Let's Encrypt 是由多家公司與非營利組織共同創立的數位憑證認證機構, 目標就是要讓網站可以免費, 申請簡單與自動化流程的憑證服務.

網路上相當多 Let’s Encrypt 憑證的申請教學, 這些教學大多數都是利用官方 certbot 進行申請, 為了避免 certbot 版本不同的差異, 只要找篇近期一些的文章跟著作即可成功.

為確保所申請憑證的 DNS 確實為申請者擁有, certbot 自動更新時需要能透過標準 http request 存取驗證資訊, 網站管理員必須把 certbot 執行當下所產生的隨機碼放置網站上特定位置, 以提供 Let's Encrypt 主機存取驗證.

而這次情況是專案主機所在網路防火牆封鎖對外的 80 Port, 無法自動申請, 需手動申請憑證與驗證.

手動申請憑證

手動下載 certbot, 放置主機上. 或利用套件管理安裝亦可.

手動申請指令與說明如下:

$ ./certbot-auto certonly --manual --no-self-upgrade --dry-run --preferred-challenge dns -d www.abc.com 
  • certonly --manual 手動申請. 自行配置 HTTP 伺服器, 或 HTTP 伺服器在其他主機上.

  • --no-self-upgrade 不自動更新 certbot. certbot 啟動時會先到 Server 檢查有沒有新版自動下載更新, 加上這個指令可強制不更新.

  • --dry-run 為避免濫用, Let's Encrypt 有驗證次數的限制, 加上 --dry-run 可以使用 stage 環境健行配置的測試. 官方文件在此

    There is a Failed Validation limit of 5 failures per account, per hostname, per hour. This limit is higher on our staging environment, so you can use that environment to debug connectivity problems. Exceeding the Failed Validations limit is reported with the error message too many failed authorizations recently.

  • --preferred-challenge dns Port 80 被封鎖無法從外部連入, 所以採用 DNS Record 驗證.

  • -d www.abc.com 最後這邊是自己的域名.

輸入後 certbot 會產生一組需配置到 DNS TXT Record 的值.
例如專案是利用 CloudFlare 當 DNS, 就在後台新增一組 TXT Record.

設置好後按 Enter, Let's Encrypt 主機會去查 _acme-challenge.www.abc.com 的值, 若相符則會核發對應的憑證.

取得憑證後即可把剛剛的 DNS Record 移除, 畢竟下次申請時內容需要替換, 留著沒意義.

Nginx 設定

取得憑證後把相關憑證檔案放在 nginx 可以存取的資料夾下, 修改 /etc/nginx/sites-enabled/deafult 新增 SSL 憑證相關配置如下:

server{
server_name www.abc.com;
listen 8888 ssl;
ssl_certificate /etc/letsencrypt/cert/www.abc.com/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/cert/www.abc.com/privkey1.pem;
ssl_dhparam /etc/ssl/certs/dhparams.pem;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
}

修改後重啟 Nginx 即可.

$ sudo nginx -t
$ sudo nginx -s reload

See Also