部署 HTTPS 網站的時候須要證書,證書由 CA (Certificate Authority )機構簽發,大部分傳統 CA 機構簽發證書是須要收費的,這不利於推進 HTTPS 協議的使用。Let’s Encrypt 也是一個 CA 機構,但這個 CA 機構是免費的!!!也就是說簽發證書不須要任何費用。html
在沒有出現通配符證書以前,Let’s Encrypt 支持兩種證書。nginx
1)單域名證書:證書僅僅包含一個主機。git
2)SAN 證書:一張證書能夠包括多個主機(Let’s Encrypt 限制是 20),也就是證書能夠包含下列的主機:www.example.com、www.example.cn、blog.example.com 等等。github
證書包含的主機能夠不是同一個註冊域,不要問我註冊域是什麼?註冊域就是向域名註冊商購買的域名。web
對於我的用戶來講,因爲主機並非太多,因此使用 SAN 證書徹底沒有問題,可是對於大公司來講有一些問題:算法
讀者能夠思考下,對於大企業來講,SAN 證書可能並不能知足需求,相似於 sina 這樣的網站,全部的主機所有包含在一張證書中,而使用 Let’s Encrypt 證書是沒法知足的。apache
通配符證書就是證書中能夠包含一個通配符,好比 .example.com、.example.cn,讀者很快明白,大型企業也可使用通配符證書了,一張證書能夠防止更多的主機了。bootstrap
這個功能能夠說很是重要,從功能上看 Let’s Encrypt 和傳統 CA 機構沒有什麼區別了,會不會觸動傳統 CA 機構的利益呢?api
Let’s Encrypt和其餘認證機構的區別:瀏覽器
從官方源安裝最新版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
建立一個 2048 位的 Diffie-Hellman 文件
(nginx 默認使用 1024 位的 Diffie–Hellman 進行密鑰交換, 安全性過低)
openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048
( 這裏以thinkbig.com爲例 )
首先對 http 協議進行 301 重定向到 https 協議
server { listen 80; server_name example.com www.thinkbig.com; return 301 https://thinkbig.com$request_uri; }
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
進入/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