Let’s Encrypt + Certbot + Nginx


certbot.png

Let’s Encrypt 現在的工具已經很完善,不像之前需要比較多的手續,主流平台 Certbot 也都支援,使用方式也很簡單, certbot 的說明也很清楚。

以 Ubuntu 16.10 + Nginx 為範例
在開始產生憑證之前,先確定相關的域名與 DNS 都已設定完成,才能夠進行。

install

$ sudo apt-get install certbot

安裝完成後,certbot 執行檔會在 /usr/bin/certbot 而相關設定檔則在 /etc/letsencrypt。
產生憑證的方式有兩種,一個使用 webroot plugin 會在網站產生一些相關的檔案,一個為 standalone 獨立執行,比較沒有其他相依性。standalone 會使用到 port 80 使用前需先將 web server 先停止。

憑證產生的語法

$ certbot certonly —standalone -d example.com -d www.example.com -d sub.example.com

可以一次產生一個憑證給多個域名,不過最好除了主域名及 www 字域名之外,其他子域名則另外分開建立,往後若需要憑證拆開使用時,比較不會遇到問題,待會兒會提到。

renewal

Let’s Encrypt 的憑證效期是 90 天,所以需要定時的更新。

$ certbot renew —dry-run

—dry-run 會進行模擬憑證過期及更新憑證流程,不會實際更新目前使用中的憑證,先測試沒問題後就可以擺到 cron 排程。

#!/bin/bash  
service nginx stop  
certbot renew  
service nginx start

nginx setup

重複使用率很高,所以放在 snippets 下比較方便。/etc/nginx/snippets/ssl.conf 範例

# spdy 已進入歷史,改使用 http2  
listen 443 ssl http2;  
listen [::]:443 ssl ipv6only=on http2;  
  
# 憑證產生的位置,更改 example.com 為實際名稱  
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  
  
# Diffie-Hellman (DH)  
# nginx/OpenSSL 預設為 1024-bit 現階段來說不夠強,因此另外產生強度高的 DHE (會花上一些時間)  
# openssl dhparam -out dhparams.pem 4096  
ssl_dhparam /etc/nginx/dhparams.pem  
  
# SSLv2, TLS 10, SSLv3 都有一些安全性的問題,也都建議捨棄  
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  
  
# Cipher Suite  
# https://wiki.mozilla.org/Security/Server_Side_TLS  
ssl_prefer_server_ciphers on;  
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";  
  
# https://cipherli.st  
  
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0  
ssl_session_cache shared:SSL:10m;  
ssl_session_tickets off; # Requires nginx >= 1.5.9  
ssl_stapling on; # Requires nginx >= 1.3.7  
ssl_stapling_verify on; # Requires nginx => 1.3.7  
  
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";  
add_header X-Content-Type-Options nosniff;  
  
# add_header X-Frame-Options DENY;  
# add_header X-Frame-Options SAMEORIGIN;

其他需要啟用 SSL 的地方,只要加上 include snippets/ssl.conf; 就可以

SSL checker

至此大部份做作都完成,可以配合其他線上分析調整。

https://www.ssllabs.com/ssltest - SSL Server Text
https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html - 不少相關設定的說明

migration

當網站需要移機,或僅某個子網站需要移機,憑證也需要跟著移機,Let’s Encrypt, certbot 目前都還沒有很方便的方式處理。首先先來瞭解 /etc/letsencrypt 的內容

  • accounts ACME 帳號註冊的一些相關資訊
  • archive 憑證檔案存放處
  • csr 產生憑證使用的 CSR
  • keys 產生憑證使用的 private key
  • live 裡面以域名為資料夾區分,裡面是各自使用到的憑證的 symbolic links
  • renewal 憑證更新設定

需要將 archive, live, renewal 複製到新的主機,live 下確認新的 symbolic links 是否正確。accounts, csr, keys 比較不影響,記得執行不確定的動作之前,都有先備份就好。再執行 —dry-run 測試憑證是否可進行更新。

問題來了,如上面範例一開始以 example.com, www.example.com, sub.example.com 產生一憑證,而現在僅需移動 sub.example.com 或反過來等類似的狀況,在更新憑證時就會發生問題,目前 certbot 可加入新的網域至已存在的憑證,但仍無法反過來操作。

在沒有比較好的 revoke 方式之前,僅能選擇分別重新建立憑證,所以一開始產生憑證時就區分開來會比較好。

Ethan Liu avatar
Ethan Liu
A web developer, iOS developer, designer and a cat slave.

comments powered by Disqus