HTTPS 連線,使用 Let's Encrypt

Let's Encrypt

要讓你的網站擁有 HTTPS 的加密連線,現在可以使用 Let's Encrypt 提供的免費 SSL 憑證服務囉~

關於 HTTPS

資料在網路中傳輸,是透過一個一個的節點(裝置)接力傳輸,在這傳輸的中間,任何傳遞資料的裝置都會收到完整的資料,這樣它才能往下傳給另一個裝置,直到到達目的地為止,因此其中只要有心人在經過的裝置中截取資料,他就能知道你傳輸的內容,這是指你透過 HTTP 連線的時候。

HTTPSHTTP 透過 TLS/SSL 加密方式來傳輸的一種協定,也就是將原本透過 HTTP 傳遞的資料封包先加密後再傳輸,這樣就算資料被取得也無法知道其中的內容。HTTP 的預設埠 (port) 是 80,HTTPS 則是 443,當你瀏覽的網站使用 HTTPS 連線,瀏覽器通常會顯示一個鎖的圖示,表示現在是以安全加密的方式連線。

由於 HTTPS 多了安全性驗證的動作,所以連線會稍慢一些些,而且憑證的費用也很高,所以早些年的網站只有在傳遞重要資料的時候,才會使用 HTTPS 連線,不過現在已經沒那麼受限了,而且資料的安全比較重要。這幾年 Google 為了推廣 HTTPS,也宣布搜尋引擎會對提供 HTTPS 的網站優先索引。

不過,一般非營利性質的網站還是負擔不起貴森森的憑證費用,還好現在有 Let's Encrypt 提供免費的憑證給大家使用。

關於 Let's Encrypt

要用來加密連線的憑證必須是由大眾信任的單位來發佈,否則這個加密就沒有意義了,因此不是什麼人都能發佈這個憑證。假如你自己發佈一個憑證給自己的網站用,這是可以的,問題是當別人打開你的網站時,瀏覽器就會發出不受信任憑證的警告,所以我們必須使用一個公開受信任的機構所發佈的憑證。

Let's Encrypt 是一個免費的憑證(CA)發行組織,由 Internet Security Research Group (ISRG) 提供服務。為的是要讓需要的人可以在網站中加入 HTTPS(SSL/TLS) 的加密連線功能,讓網路連線更加安全。詳細的介紹可以看看 About Let's Encrypt

安裝命令工具

2018/8/16 補充:Certbot 有新版本,請先參考解決 Let's Encrypt tls-sni-01 的問題一文的內容。

要取得 Let's Encrypt 所提供的憑證並安裝,可以透過命令工具來達成,所以要先來安裝命令工具。
先到 Certbot 網站選擇你所使用的伺服器及作業系統,它會有說明如何安裝及使用,選擇不同指令會略有不同,以下是我操作的流程。
安裝:
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
所謂的安裝其實只是把命令工具下載下來而已。第一行會下載 certbot-auto 這個指令腳本檔,第二行把它指定為可執行。
註:執行時需要用到 Python3 請確定作業系統中已安裝。

取得憑證

接下來全部的動作都能透過這個命令工具來執行。
你可以直接執行
./certbot-auto
過程中會詢問你要啟用 HTTPS 的網站名稱,它會列出清單讓你選,可以用逗號以數字來選擇多個,或是直接按 Enter 來選擇全部。
接著它會問你要讓 HTTPS 為必要的還是選擇性的:
  • 1:Easy:允許 HTTP 及 HTTPS 連線都能存取網站
  • 2:Secure:所有的連線將只透過 HTTPS
如果不是很確定的話,可以先選 1,等確定網站可以正常的在 HTTPS 下運作,在重做這個動作然後選擇 2。
如果你的伺服器是 Apache ,可以加入參數:
./certbot-auto --apache
讓它幫你做設定,或是只要產生憑證檔就好,其他我自己來:
./certbot-auto --apache certonly
註:也有 --nginx 的選項,可以透過 -h 來查詢。
如果有多個虛擬主機 (VirtualHost),可以使用
./certbot-auto --apache -d example.com -d www.example.com
第一個 -d 是主網域,後面可以接多個 -d 加入其他子網域。

全域指令

你可以把 certbot-auto 移動到 /usr/local/bin 目錄,然後把名稱縮短,這樣會比較方便日後的操作。例如:
mv certbot-auto /usr/local/bin/certbot
這樣你就可以在任何地方以 certbot 的方式執行指令。

更新憑證

Let's Encrypt 提供的憑證有 90 天的期限限制,也就是到期後憑證就失效了,但是可以透過更新憑證的方式繼續使用。
更新指令:
certbot-auto renew
你可以在憑證到期時執行以上指令來完成憑證的更新。不過這樣每 90 天就要做一次實在有點麻煩,雖然它會 email 通知你。我們可以使用 Linux 內建的排程服務來做:
sudo crontab -e
-e 可以編輯排程,-l 可以查看。
每個任務排程為一行,格式為:分 時 日 月 星期 指令用一個空白隔開,所以:
30 2 * * 1 /usr/local/bin/certbot-auto renew --quiet
就是每星期一凌晨 2:30 執行更新,--quiet 參數可以讓它不輸出任何文字。更新的動作只有在憑證到期時才會真的更新,否則就是只做檢查的動作而已。
註1:排程的編輯是使用 vi。
註2:更新憑證的動作請不要太頻繁,這樣會加重 Let's Encrypt 伺服器的負擔。

虛擬主機的設定

註:依不同的作業系統及伺服器可能會有所不同,如果你只有一個網域(或虛擬主機),可能以下都不需要做,這裡只是參考。
Apache 的設定檔在 /etc/httpd/conf/httpd.conf
<VirtualHost _default_:80>
    DocumentRoot "/var/www/html"
    ServerName example.com
    ServerAlias www.example.com
    ErrorLog logs/www.example.com-error_log
    CustomLog logs/www.example.com-access_log common
</VirtualHost>

<VirtualHost _default_:443>
    DocumentRoot "/var/www/html"
    ServerName example.com
    ServerAlias www.example.com
</VirtualHost>
這是大概的設定,80 port 是 HTTP 連線,443 port 則是透過 HTTPS 連線。通常已經有 80 port 的設定了,只要增加 443 port 的設定即可。
SSL 的設定檔在 /etc/httpd/conf.d/ssl.conf,這裡基本上是不需更動的。

測試 SSL

設定完成後,可以到 SSL Server Test 測試看看。
可以看看頁面一開始的幾個項目:
  • Common names:是主網域的名稱
  • Alternative names:當你有申請其他子網域時會列在這裡
  • Valid from:這是你的憑證有效期的開始時間,也就是你申請的時間
  • Valid until:這是憑證到期的時間

參考資料


2017-04-08 補充

遇到無法 renew 的情況可以強制更新:
certbot-auto renew --force-renewal

要查詢憑證的資訊,例如到期日,可以用指令查詢
certbot-auto certificates
本文網址:https://blog.tonycube.com/2017/01/https-lets-encrypt.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。