Google 從 2014 就開始宣告要將 HTTPS 列為 ranking signal 之一的項目,對於 SEO 是一個很重要的公開指標,以往 Google 對於 ranking signal 絕不公開,可見 Google 對於網站加密非常看重
對於某些網站可能是自行經營像是小弟僅是使用一台非常爛的主機在跑 Blog 做紀錄,買個網域就已經很奢侈了要在買下 SSL 憑證一年約增加 1000 左右的成本實在不划算
但是在這個大環境下的資安越來越重要,就出現了許多提供免費 SSL 憑證的平台;如 StartSSL、WoSign(沃通)、CloudFlare
StartSSL 是很久以前的老牌免費 SSL 憑證提供一年期,但是申請一次非常的複雜,而 WoSign 也是非常的繁複,CloudFlare 雖然只要打開 SSL 支援就可以使用,但是 Windows XP Chrome 並不支援會出現「ERR_SSL_VERSION_OR_CIPHER_MISMATCH」,幾經研究最後選擇 Let’s Encrypt 這一個 SSL 憑證,原因如下介紹。
Let’s Encrypt 是由許多大公司以及各大非營利團體為了推廣 HTTPS 而贊助的一家免費發佈 SSL certificate 的 Certiciate Authority。
限制
Let’s Encrypt 目前已經正式開放,但有發行數量限制,一般人可能會遇到的:
- Names/Certificate:單一 certificate 限制 100 個 hostname。
- Certificates/Domain:每個 domain 每個禮拜最多 20 個 certificate,但 renew 不計算在 quota 內 (需要憑證內的 hostname 與之前完全一樣)。
- Certificates/FQDNset:相同 hostname 的憑證每個禮拜最多發出五個。。
Let’s Encrypt 申請 SSL 憑證
由於網路上已經太多 Let’s Encrypt 的申請教學並且已經很詳細了小弟在這邊就不再贅述如何從網站上申請,在這篇就來討論比較技術性的申請方式!
Let’s Encrypt 申請一次是只有三個月的期限,如果每三個月就要申請一次也太累了,所以在這邊除了申請,還包含了自動續約 (Auto Renew) 的教學,讓站長們不用再關心自己的網站憑證是否過期。
Let’s Encrypt 除了免費 SSL 還佛心到提供 Certbot 這個自動續約的工具
Step.1 從 git clone 一份 Certbot 下來
$ cd /usr/local/ $ git clone https://github.com/certbot/certbot
Step.2 第一次建立 SSL 憑證使用 certbot 自動產生憑證 shazi.info 和 test.shazi.info
$ ./certbot-auto --nginx -d shazi.info
在這邊必須特別注意的是使用 –nginx 他會去檢查你的設定檔中是否有 server_name 有 shazi.info 這個 hostname,如果沒有會建立失敗。
如果你只是單純想建立 SSL 憑證,就寫個 nginx 的 config,server_name 為 shazi.info 這個網域,因為 Let’s Encrypt 會去搜尋後加入 SSL 參數與 Listen 443,但這都不是本篇的重點。
$ vim /etc/nginx/conf.d/shazi.info.conf server { listen 80; server_name shazi.info; ... }
Step.3 使用 Easy 安裝
在出現這個畫面之前 certbot 會驗證你要申請的網域是否可以訪問以及 web server 是否有誤。
Step.4 在第一次建立好 certbot 好之後會產生設定在 /etc/letsencrypt
# 憑證檔案產生處 $ ls /etc/letsencrypt/archive/shazi.info cert1.pem chain1.pem fullchain1.pem privkey1.pem # letsencrypt會產生softlink提供給web server使用,目的是用來auto renew $ ls -l /etc/letsencrypt/live/shazi.info lrwxrwxrwx 1 root root 34 Nov 28 02:43 cert.pem -> ../../archive/shazi.info/cert1.pem lrwxrwxrwx 1 root root 35 Nov 28 02:43 chain.pem -> ../../archive/shazi.info/chain1.pem lrwxrwxrwx 1 root root 39 Nov 28 02:43 fullchain.pem -> ../../archive/shazi.info/fullchain1.pem lrwxrwxrwx 1 root root 37 Nov 28 02:43 privkey.pem -> ../../archive/shazi.info/privkey1.pem # 然後shazi.info設定檔certbot就會很雞婆的自動加上ssl參數 $ cat /etc/nginx/conf.d/shazi.info.conf server { ... listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/shazi.info/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/shazi.info/privkey.pem; # managed by Certbot ssl_session_cache shared:le_nginx_SSL:10m; # managed by Certbot ssl_session_timeout 10m; # managed by Certbot ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # managed by Certbot ssl_prefer_server_ciphers on; # managed by Certbot ssl_ciphers [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA; # managed by Certbot ... }
Step.5 如上 certbot 自動加入的 SSL 參數都已經不適用在現在,因為本篇要延伸前一篇 “Nginx 編譯最新的 SSL(Chacha20-Poly1305)” 使用 http2 進行 SSL
# 修改SSL設定檔支援http/2 $ vim /etc/nginx/conf.d/shazi.info.conf server { listen 443 ssl http2; server_name shazi.info; index index.php index.html; ssl on; ssl_certificate /etc/letsencrypt/live/shazi.info/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/shazi.info/privkey.pem; ssl_ciphers [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; }
Step.5 重啟 nginx 驗證 SSL 憑證,並且支援 chacha20 的綠色小鎖頭
自動 Renew Let’s Encrypt SSL 憑證
當憑證申請搞定之後,就要讓他能自動重新續約 SSL 憑證
Step.1 certbot Auto Renew 的設定是參考在/etc/letsencrypt/renewal
$ vim /etc/letsencrypt/renewal/shazi.info.conf # renew_before_expiry = 30 days version = 0.9.3 cert = /etc/letsencrypt/live/shazi.info/cert.pem privkey = /etc/letsencrypt/live/shazi.info/privkey.pem chain = /etc/letsencrypt/live/shazi.info/chain.pem fullchain = /etc/letsencrypt/live/shazi.info/fullchain.pem # Options used in the renewal process [renewalparams] authenticator = nginx installer = nginx account = c1a94fsdfbd385eqqee65463d88ds6d481
憑證的路徑是 certbot 產生時的 softlink,必須存在。
Step.2 使用 certbot 提供的 letsencrypt-auto 這個工具自動續約
$ cd /usr/local/certbot $ ./letsencrypt-auto renew Saving debug log to /var/log/letsencrypt/letsencrypt.log ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/shazi.info.conf ------------------------------------------------------------------------------- Cert not yet due for renewal The following certs are not due for renewal yet: /etc/letsencrypt/live/shazi.info/fullchain.pem (skipped) /etc/letsencrypt/live/cloud.shazi.info/fullchain.pem (skipped) No renewals were attempted.
檢查完沒有需要續約的憑證自動略過
Step.3 建立在 crontab 每天檢查一次
$ crontab -e 0 0 * * * sh /usr/local/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt-auto.log
打完收工!!