初探 Let’s Encrypt

第一次知道 Let’s Encrypt 是在今年九月初左右,當時看到這計畫覺得非常開心,心想,未來網站連線將會更加安全(終於不用花錢買憑證了),再加上自動化的安裝,可以讓一般使用者也無痛使用,因此,從那時起,就期待著正式上線。

時間來到了十二月初,Let’s Encrypt 終於進入 Public Beta 了,儘管有著自動化的安裝,但身為資工的學生,當然要自己摸索過一次囉,因此,本文章就順勢誕生啦(不過好像已經十二月底了)。


教學將分為以下幾點

∗:整個安裝過程皆需使用有 root 權限的帳號

∗:環境是 Ubuntu 16.04,不同作業系統在設定及路徑上可能會有差異

∗:因 WordPress 問題,兩個「-」會被取代成「–」,請特別注意

安裝 Let’s Encrypt

透過 apt 套件管理工具安裝即可

apt install letsencrypt

接著就可以申請憑證囉,取得的方式有兩種,standalone 或 webroot,底下將分別介紹

以 Standalone 的方式取得憑證

如果要以 standalone 的方式取得憑證,必須確保 80 或 443 port 沒有被佔用,因此,如果你的伺服器已有 Web 服務在運作且無法暫時停止,則需使用 webroot 的方式取得憑證,需特別注意的是,如果網站有使用 CloudFlare,則一樣需使用 webroot 的方式取得憑證

當確認 80 或 443 port 沒被佔用後,請透過以下指令來取得憑證(參數會根據不同狀況而有差異)

letsencrypt certonly –standalone –standalone-supported-challenges http-01|tls-sni-01 -m your_email_address –agree-tos –rsa-key-size 4096 -d your_domain_name

  • –standalone:使用 standalone 的方式作認證
  • –standalone-supported-challenges:認證所使用的 port,http-01 是 80 port,tls-sni-01 則是 443 port,請選擇你要用來認證的 port
  • -m:你的信箱
  • –agree-tos:同意 Let’s Encrypt 的用戶協議
  • –rsa-key-size:RSA key 的 size,預設是 2048
  • -d:欲申請憑證的域名,可以一次申請多個,e.g. -d example.com -d free.example.com

稍待片刻就會看到成功畫面,這樣憑證申請就完成囉!

以 Webroot 的方式取得憑證

接著,將介紹以 webroot 的方式取得憑證,這是我較推薦的方法,因為不用停止暨有的網站服務,使用 CloudFlare 也沒問題,是相當具有彈性的方法

與 standalone 相同的指令,只是參數不同

letsencrypt certonly –webroot -w your_web_document_root -m your_email_address –agree-tos –rsa-key-size 4096 -d your_domain_name

  • –webroot:使用 webroot 的方式作驗證
  • -w:web service document root,e.g. /var/www/html
  • -m:你的信箱
  • –agree-tos:同意 Let’s Encrypt 的用戶協議
  • –rsa-key-size:RSA key 的 size,預設是 2048
  • -d:欲申請憑證的域名,可以一次申請多個,e.g. -d example.com -d free.example.com,如不同路徑對應到不同域名,則參數使用方式如下,e.g. -w /var/www/html -d example.com -w /var/www/free -d free.example.com

一樣稍等一下後就會看到成功畫面囉~

憑證設定

Nginx

使用你喜愛的編輯器編輯網站設定檔,預設路徑是 /etc/nginx/site-enabled/default,如果 https server 未註解,請先將註解拿掉

接著,設定 certificate 路徑,參考範例如下

ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;

設定支援的協定及 cipher

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:EDCH+AES256:ECDH+AES128:!MD5:!aNULL;
ssl_prefer_server_ciphers on;

啟用 ssl 快取

ssl_session_cache shared:SSL:30m;
ssl_session_tickets on;
ssl_session_timeout 1h;

啟用 OCSP stapling

ssl_stapling on;
ssl_stapling_verify on;

這樣相關配置就完成囉,重啟 nginx 後一切應該就會如預期運作囉!

Apache

一樣使用你喜愛的編輯器編輯網站設定檔,預設路徑為 /etc/apache2/sites-enabled/default-ssl.conf

首先,確認「SSLEngine on」是否已移除掉註解符號

接著,設定 certificate 路徑,參考範例如下

SSLCertificateFile /etc/letsencrypt/live/domain_name/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain_name/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain_name/chain.pem

如欲啟用 OCSP stapling,請在 VirtualHost 區域內新增下列設定

SSLUseStapling on

並在 VirtualHost 上方加上下列設定

SSLStaplingCache shmcb:/tmp/stapling_cache(128000)

設定完成後應該會類似下面圖片中的結構

接著,請編輯 apache ssl 設定檔,預設路徑為 /etc/apache2/mods-enabled/ssl.conf

啟用 ssl 快取

SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
SSLSessionCacheTimeout 300

設定 cipher

SSLCipherSuite ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!MD5:!aNULL

設定支援的協定

SSLProtocol all -SSLv3

完成後存檔即完成所有設定,重啟 apache 後網站應該就能支援 https 了。

注意事項

  • 如想確認 ssl 是否皆設置正確,可使用 ssllab 提供的檢查服務

網址:https://www.ssllabs.com/ssltest/

如是按造本篇文章的教學設定,預期是可獲得 A 的等級,如想提升為 A+,則可將 HSTS 加入 HTTP 的 header 中


  • 憑證有效期限為 90 天,亦即每三個月需 renew 一次,原因可查看此篇說明,而人總是很懶的,因此就提供 crontab 自動 renew 的設定

編輯 crontab

crontab -e

於最下方新增此排程任務

@weekly /usr/bin/letsencrypt renew

這樣自動 renew 的事情就完成囉,一切都是這麼簡單


教學到此就告一個段落囉,這也是我第一次發教學文章,覺得相當累啊,也很怕自己寫了錯誤的資訊,因此如果你發現有什麼問題的話,請在回覆中告知我,也先謝謝你的提醒!