什么是 Let’s Encrypt?
部署 HTTPS 網站的時候需要證書,證書由 CA (Certificate Authority )機構簽發,大部分傳統 CA 機構簽發證書是需要收費的,這不利於推動 HTTPS 協議的使用。Let’s Encrypt 也是一個 CA 機構,但這個 CA 機構是免費的!!!也就是說簽發證書不需要任何費用。
什么是通配符證書?
在沒有出現通配符證書之前,Let’s Encrypt 支持兩種證書。
1)單域名證書:證書僅僅包含一個主機。
2)SAN 證書:一張證書可以包括多個主機(Let’s Encrypt 限制是 20),也就是證書可以包含下列的主機:www.example.com、www.example.cn、blog.example.com 等等。
證書包含的主機可以不是同一個注冊域,不要問我注冊域是什么?注冊域就是向域名注冊商購買的域名。
對於個人用戶來說,由於主機並不是太多,所以使用 SAN 證書完全沒有問題,但是對於大公司來說有一些問題:
- 子域名非常多,而且過一段時間可能就要使用一個新的主機。
- 注冊域也非常多。
讀者可以思考下,對於大企業來說,SAN 證書可能並不能滿足需求,類似於 sina 這樣的網站,所有的主機全部包含在一張證書中,而使用 Let’s Encrypt 證書是無法滿足的。
Let’s Encrypt 通配符證書
通配符證書就是證書中可以包含一個通配符,比如 .example.com、.example.cn,讀者很快明白,大型企業也可以使用通配符證書了,一張證書可以防止更多的主機了。
這個功能可以說非常重要,從功能上看 Let’s Encrypt 和傳統 CA 機構沒有什么區別了,會不會觸動傳統 CA 機構的利益呢?
為什么選擇Let’s Encrypt?
Let’s Encrypt和其他認證機構的區別:
如何申請 Let’s Encrypt 通配符證書
安裝Certbot
從官方源安裝最新版certbot(最新版為0.22.0,從0.22.0版本才開始支持泛域名申請)
wget https://dl.eff.org/certbot-auto chmod a+x ./certbot-auto
初始化
./certbot-auto
獲取證書
因為目前大多數國內的DNS服務商不在API支持的列表里,所以以下使用手動方式進行DNS認證,只要將下方命令中的*.thinkbig.com
替換為自己的域名即可。注意!域名的 minirplus.com
解析記錄必須以 A記錄
方式指向當前運行命令的服務器IP,而不能使用CNAME記錄。
./certbot-auto certonly --manual -d *.thinkbig.com --agree-tos --no-bootstrap --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
輸入郵箱
,用於接收證書過期通知:
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):
接着會出現一段廣告,大意是收集客戶郵箱給贊助商,Y
或 N
均可
------------------------------------------------------------------------------- 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:
接着重要的部分來了,在域名注冊商的網站,解析記錄中添加一個 _acme-challenge
前綴的域名 TXT記錄
,記錄的內容為中間顯示的隨機碼_MdwehUGJ_qSMWNy7acNo_QzuS1YnV8_772JZUGmqQY
我用的是阿里雲,找到對應的域名,添加解析記錄即可
------------------------------------------------------------------------------- Please deploy a DNS TXT record under the name _acme-challenge.thinkbig.com with the following value: _MdwehUGJ_qSMWNy7acNo_QzuS1YnV8_772JZUGmqQY Before continuing, verify the record is deployed. ------------------------------------------------------------------------------- Press Enter to Continue
接着確保當前域名的根記錄 thinkbig.com 為 A記錄
並且指向當前服務器IP(這條原本不成問題,因為國外的服務商的DNS根域名只能添加A記錄,但是國內的DNSPOD則更加靈活,可以添加CNAME記錄,所以會在認證的時候出現問題)
按回車,進行認證
等待片刻,出現如下信息,說明認證成功
申請操作成功后, 會在界面中輸出證書的存放路徑, 以及證書的到期時間 (90天)
Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/thinkbig.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/thinkbig.com/privkey.pem Your cert will expire on 2019-02-19. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
證書的存放路徑
( 這里以thinkbig.com為例 )
生成證書中會創建 /etc/letsencrypt
文件夾, 證書文件默認存放在 /etc/letsencrypt/live/thinkbig.com
文件夾中, 其中 thinkbig.com 取自第一個域名
在 thinkbig.com 文件夾中包含 4 個文件 ./cert.pem ./chain.pem ./fullchain.pem ./privkey.pem
- cert.pem 域名證書
- chain.pem 根證書及中間證書
- fullchain.pem 由 cert.pem 和 chain.pem 合並而成
- privkey.pem 證書私鑰
創建一個 2048 位的 Diffie-Hellman 文件
(nginx 默認使用 1024 位的 Diffie–Hellman 進行密鑰交換, 安全性太低)
openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048
nginx TSL 配置 (強制http重定向到https)
( 這里以thinkbig.com為例 )
首先對 http 協議進行 301 重定向到 https 協議
server { listen 80; server_name example.com www.thinkbig.com; return 301 https://thinkbig.com$request_uri; }
Nginx Https 相關配置( 這里以thinkbig.com為例 )
server { listen 443 ssl; server_name thinkbig.com www.thinkbig.com; # 配置站點證書文件地址 ssl_certificate /etc/letsencrypt/live/thinkbig.com/fullchain.pem; # 配置證書私鑰 ssl_certificate_key /etc/letsencrypt/live/thinkbig.com/privkey.pem; # 配置 Diffie-Hellman 交換算法文件地址 ssl_dhparam /etc/letsencrypt/live/dhparams.pem; # 配置服務器可使用的加密算法 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'; # 指定服務器密碼算法在優先於客戶端密碼算法時,使用 SSLv3 和 TLS 協議 ssl_prefer_server_ciphers on; # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2 # ie6 只支持 SSLv2,SSLv3 但是存在安全問題, 故不支持 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 配置 TLS 握手后生成的 session 緩存空間大小 1m 大約能存儲 4000 個 session ssl_session_cache shared:SSL:50m; # session 超時時間 ssl_session_timeout 1d; # 負載均衡時使用 此處暫時關閉 詳情見 https://imququ.com/post/optimize-tls-handshake.html # 1.5.9 及以上支持 ssl_session_tickets off; # 瀏覽器可能會在建立 TLS 連接時在線驗證證書有效性,從而阻塞 TLS 握手,拖慢整體速度。OCSP stapling 是一種優化措施,服務端通過它可以在證書鏈中封裝證書頒發機構的 OCSP(Online Certificate Status Protocol)響應,從而讓瀏覽器跳過在線查詢。服務端獲取 OCSP 一方面更快(因為服務端一般有更好的網絡環境),另一方面可以更好地緩存 以上內容來自 https://imququ.com/post/my-nginx-conf-for-wpo.html # 1.3.7 及以上支持 ssl_stapling on; ssl_stapling_verify on; # 根證書 + 中間證書 ssl_trusted_certificate /etc/letsencrypt/live/thinkbig.com/fullchain.pem; # HSTS 可以告訴瀏覽器,在指定的 max-age 內,始終通過 HTTPS 訪問該域名。即使用戶自己輸入 HTTP 的地址,或者點擊了 HTTP 鏈接,瀏覽器也會在本地替換為 HTTPS 再發送請求 相關配置見 https://imququ.com/post/sth-about-switch-to-https.html add_header Strict-Transport-Security max-age=60; # 在此填寫原本 http 協議中的配置 }
以上配置完成后, 重啟 nginx 即可完成對 https 的切換
service nginx restart
Apache Https 相關配置( 這里以thinkbig.com為例 )
進入/etc/apache2/sites-available,修改泛域名配置文件(這里以000-default.conf為例),添加SSL配置,將下面配置中的SSL證書地址,替換為之前成功獲取的證書地址(如直接使用以下配置,請修改DocumentRoot和Directory目錄為泛域名指向的目錄)
<VirtualHost *:80> ServerAdmin admin@thinkbig.com DocumentRoot /var/www/vps ServerSignature Off <Directory /var/www/vps > Options -Indexes </Directory> </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin admin@thinkbig.com DocumentRoot /var/www/vps ServerSignature Off <Directory /var/www/vps > Options -Indexes </Directory> SSLEngine on SSLCertificateFile /etc/letsencrypt/live/thinkbig.com/fullchain.pem; SSLCertificateKeyFile /etc/letsencrypt/live/thinkbig.com/privkey.pem </VirtualHost> </IfModule>
更新證書:
certbot生成的證書是有90天期限的。
使用以下命令即可進行 續期, 續期成功后需要服務器
./certbot-auto renew
該命令只會對快到期的證書才會進行更新, 如果希望強制更新, 可以增加 --force-renewal
參數
自動更新證書:
crontab中加上下邊這句:
0 0 1 */2 * certbot-auto renew --quiet --force-renewal
了解更多,https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au