要讓你的網站擁有 HTTPS 的加密連線,現在可以使用 Let's Encrypt 提供的免費 SSL 憑證服務囉~
關於 HTTPS
資料在網路中傳輸,是透過一個一個的節點(裝置)接力傳輸,在這傳輸的中間,任何傳遞資料的裝置都會收到完整的資料,這樣它才能往下傳給另一個裝置,直到到達目的地為止,因此其中只要有心人在經過的裝置中截取資料,他就能知道你傳輸的內容,這是指你透過 HTTP 連線的時候。HTTPS 是 HTTP 透過 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
如果你的伺服器是 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:這是憑證到期的時間
參考資料
- Let's Encrypt
- Certbot
- How to Set Up Let’s Encrypt Certificates for Multiple Apache Virtual Hosts on Ubuntu 14.04
2017-04-08 補充
遇到無法 renew 的情況可以強制更新:certbot-auto renew --force-renewal
要查詢憑證的資訊,例如到期日,可以用指令查詢
certbot-auto certificates
本文網址:http://blog.tonycube.com/2017/01/https-lets-encrypt.html
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。