Let’s Encrypt + Certbot + Nginx
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
產生憑證使用的 CSRkeys
產生憑證使用的 private keylive
裡面以域名為資料夾區分,裡面是各自使用到的憑證的 symbolic linksrenewal
憑證更新設定
需要將 archive
, live
, renewal
複製到新的主機,live
下確認新的 symbolic links 是否正確。accounts
, csr
, keys
比較不影響,記得執行不確定的動作之前,都有先備份就好。再執行 —dry-run
測試憑證是否可進行更新。
問題來了,如上面範例一開始以 example.com, www.example.com, sub.example.com 產生一憑證,而現在僅需移動 sub.example.com 或反過來等類似的狀況,在更新憑證時就會發生問題,目前 certbot 可加入新的網域至已存在的憑證,但仍無法反過來操作。
在沒有比較好的 revoke 方式之前,僅能選擇分別重新建立憑證,所以一開始產生憑證時就區分開來會比較好。