這幾天隱約想起2015年底好像有看到訊息2016年會有免費的 SSL憑證 可以申請
稍微搜尋了一下有找到 Let’s Encrypt 有提供,其相關背景鸚鵡就不贅述囉
值得注意的是 Let’s Encrypt 提供的憑證只有90天,每60可以更新(renew)憑證
點進網站按下 Get Started 並沒相關申請界面,而是說明採用 ACME protocol 來進行申請。
因此必須主機上擁有使用 shell 的權限才能進行,也就是要有 Linux 基本能力 並且可以使用 ssh 連上主機,而且能取得 root 權限
不熟悉的人可以選擇透過 SSL For Free 來進行申請。步驟不多挺簡單,網路上也很多教學,有需要可以自己搜尋一下。很多提供虛擬主機服務商也都有整合 Let’s Encrypt 服務,
鸚鵡是自己管理主機,所以就自己選擇工具安裝申請憑證,以下就大概紀錄一下步驟
官方推薦使用 Certbot 這個 ACME client,除了 Certbot 外還有很多其他的選擇,有需要的可以到 這邊 逛逛。
鸚鵡選擇官方推薦的 Certbot 這工具
(Certbot 在 2016 年也有了新的名稱:letsencrypt 或 letsencrypt-auto)
Certbot 提供相當完整的安裝指引,到 https://certbot.eff.org/
選擇 Web Server 和 系統就會有安裝指引
但是鸚鵡已經自行管理自己的 Linux 主機多年,對於設定檔和目錄結構也都有自己慣用的模式,所以安裝時是選擇獨立安裝(standalone)的模式
步驟大概就是這些
- 下載 Certbot
- 以
standalonewebroot 模式進行安裝來申請 SSL憑證 - 自己修改 Apache 的設定檔,測試 HTTPS 協定
- 將 http 協定的所有請求導向 https 協定
- 設定 定時更新憑證
主機環境:
- CentOS 7 x64
- Apache 2.4.6
- 下載 Certbot
1234567# 範例是將 Certbot 安裝到 /home/certbot 這個路徑# 使用 git 將 Centbot clone 一份回來[root@host ~]# cd /home[root@host home]# git clone https://github.com/certbot/certbot[root@host home]# cd certbot[root@host certbot]# 以 standalone 模式進行安裝來申請 SSL憑證
稍微再深入了解後,往後的 renew 認證也會以申請時的方式進行認證
所以使用 standalone 模式申請會造成 renew 時 網頁伺服器 被關閉以進行驗證
因此建議以 webroot 的方式進行申請要申請的 domain 是:ezbox.idv.tw 和 www.ezbox.idv.tw
12345678910111213141516171819# firewall-cmd 開啟 https 的 443 port (參數 --permanent 代表永久保存這個設定)[root@host certbot]# firewall-cmd --permanent --add-service=https[root@host certbot]# firewall-cmd --reload# iptables 開啟 https 的 443 port[root@host certbot]# iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT# 先看一下 Certbot 的說明[root@host certbot]# ./certbot-auto --help# certbot 會自動使用 yum 檢查並安裝需要的工具# yum 會自行安裝,若有提示是否要安裝,直接輸入 y[root@host certbot]# ./certbot-auto certonly --webroot \> -d ezbox.idv.tw -d www.ezbox.idv.tw# 接下來會提示輸入 email,也會針對 domain 要求輸入 網站根目錄 的絕對路徑# 依照畫面要求各別輸入即可# 再接著相關聲明與規範,選擇 Agree 按下 enter
如果沒有問題,就會在畫面上看到這樣的訊息
123Generating key (2048 bits):/etc/letsencrypt/keys/0000_key-certbot.pemCreating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
這樣,就完成 SSL憑證 的申請了!就是這樣簡單 ^_^這時候 SSL憑證 可以在主機上的 /etc/letsencrypt/live 找到 Domain 的子目錄
以本範例申請的 Domain 是 ezbox.idv.tw 為例
完整的路徑是:/etc/letsencrypt/live/ezbox.idv.tw其中會有4個檔案(連結):
1234567891011# 申請的網域的SSL憑證cert.pem: Your domain's certificate# Let's Encrypt 的 鏈證書chain.pem: The Let's Encrypt chain certificate# cert.pem 和 chain.pem 的合併檔fullchain.pem: cert.pem and chain.pem combined# SSL憑證的私鑰,千千萬萬要飽護好privkey.pem: Your certificate's private key- 測試一下 https 協定是否正常
假設原本的網站的 virtualhost 設定是123456<VirtualHost *:80>ServerAdmin service@ezbox.idv.twDocumentRoot /home/ezbox.idv.twServerName ezbox.idv.twServerAlias www.ezbox.idv.tw</VirtualHost>那麼在新增下面的內容
1234567891011121314Listen 443 https<VirtualHost *:443>ServerAdmin service@ezbox.idv.twDocumentRoot /home/ezbox.idv.twServerName ezbox.idv.twServerAlias www.ezbox.idv.twSSLEngine OnSSLCertificateFile /etc/letsencrypt/live/ezbox.idv.tw/cert.pemSSLCertificateKeyFile /etc/letsencrypt/live/ezbox.idv.tw/privkey.pemSSLCertificateChainFile /etc/letsencrypt/live/ezbox.idv.tw/chain.pemSSLCACertificateFile /etc/letsencrypt/live/ezbox.idv.tw/fullchain.pem</VirtualHost>然後重新啟動 Apache 後應該就可以做 https 連線了
不過安裝 mod_ssl 時,有一個預設的設定檔造成 apache 無法正常啟動
路徑是:/etc/httpd/conf.d/ssl.conf
所以鸚鵡將其更名為 /etc/httpd/conf.d/ssl.conf.bak 後就可以正常啟動 apache - 最後將 http 的連線自動導向到 https
鸚鵡是選擇用 mod_rewrite 來做處理,完整的設定如下1234567891011121314151617181920212223<VirtualHost *:80>ServerAdmin service@ezbox.idv.twDocumentRoot /home/ezbox.idv.twServerName ezbox.idv.twServerAlias www.ezbox.idv.twRewriteEngine OnRewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]</VirtualHost>Listen 443 https<VirtualHost *:443>ServerAdmin service@ezbox.idv.twDocumentRoot /home/ezbox.idv.twServerName ezbox.idv.twServerAlias www.ezbox.idv.twSSLEngine OnSSLCertificateFile /etc/letsencrypt/live/ezbox.idv.tw/cert.pemSSLCertificateKeyFile /etc/letsencrypt/live/ezbox.idv.tw/privkey.pemSSLCertificateChainFile /etc/letsencrypt/live/ezbox.idv.tw/chain.pemSSLCACertificateFile /etc/letsencrypt/live/ezbox.idv.tw/fullchain.pem</VirtualHost>再次重新啟動 apache 後,所有連線就會自動導向到 https 連線
- 設定自動更新憑證
第3步驟安裝完成時就有提示,如果要一次全部檢查所有已申請的憑證
執行:certbot-auto renew
所以我們來測試看看1234567891011[root@git certbot]# ./certbot-auto renewSaving debug log to /var/log/letsencrypt/letsencrypt.log-------------------------------------------------------------------------------Processing /etc/letsencrypt/renewal/git.ezbox.idv.tw.conf-------------------------------------------------------------------------------Cert not yet due for renewalThe following certs are not due for renewal yet:/etc/letsencrypt/live/git.ezbox.idv.tw/fullchain.pem (skipped)No renewals were attempted.有進行檢查,並且判定還不需要做 renew (因為我們才剛申請到)
有效期是 90天,滿 60天後可以 renew
所以鸚鵡設定 每週日 的凌晨 5點整執行檢查1echo "0 5 * * 0 root /home/certbot/certbot-auto renew --quiet" >> /etc/crontab這樣便完成了所有的動作
在服務沒有取消前或取消免費前,我們就可以擁有一個免費的 SSL憑證
附註:
以 standalone 申請時, Certbot 會停止主機上 httpd 服務,啟動獨立的 Web Server 開始驗證您輸入的 domain 是否是您所擁有
這時候也必須確認主機上的 443 port 是可以正常連線的,否則會看到類似這樣的錯誤訊息
1 2 3 |
Failed authorization procedure. ezbox.idv.tw (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Failed to connect to YOUR_IP_ADDRESS:443 for TLS-SNI-01 challenge |
延伸閱讀