很多人經常在使用 Certbot 申請 Let’s Encrypt 證書的時候,犯一些小錯誤,或者不知道如何正確操作,這篇文章簡單總結下我的一些經驗,後續如果還有一些新的收穫,還會隨時介紹。
廢話少說,下面列舉下我的一些小經驗。
1:設置郵箱接收證書過期的通知
在使用 certbot 的時候,很多人沒有意識到 account 的創建,每個 account 對應一個 email 地址,可以通過下列命令修改 account 對應的 email 地址。
$ certbot-auto register --update-registration --email admin@example.com
那配置 email 的用處是什麼呢?一張 Let’s Encrypt 證書有效期是 90 天,有效期太短,很多人忘記續期,Let’s Encrypt 會在證書快過期的時候,給 email 地址發送證書快過期的通知。
2:使用 certbot 還是 certbot-auto?
certbot 和 certbot-auto 本質上沒有區別,但很多人疑惑兩者的區別,certbot-auto 對 certbot 做了包裝,可以設置系統環境或自動升級。
我個人更喜歡 certbot-auto 的安裝方式:
$ wget https://dl.eff.org/certbot-auto$ chmod a+x ./certbot-auto
而如果使用包安裝方式,安裝的是 certbot 工具。
$ apt-get install certbot
3:不要 rm 刪除證書
由於 Let’s Encrypt 證書可以通過工具自由申請,很多人會無節制的操作,從而出現了很多無用證書,很多操作者不知道如何處理這些舊證書,就輕易的 rm 刪除。
這是非常不好的一個習慣,因為一些證書如果沒有到期,被攻擊者利用了就比較麻煩,正確處理無用證書的方式如下。
先查看目前機器上申請過的證書:
$ certbot-auto certificates
輸出如下:
Found the following certs: Certificate Name: simplehttps.com Domains: *.simplehttps.com Expiry Date: 2018-10-15 05:21:15+00:00 (VALID: 52 days) Certificate Path: /etc/letsencrypt/live/simplehttps.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/simplehttps.com/privkey.pem Certificate Name: yudadan.com Domains: *.yudadan.com *.simplehttps.com Expiry Date: 2018-10-15 04:52:47+00:00 (VALID: 52 days) Certificate Path: /etc/letsencrypt/live/yudadan.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/yudadan.com/privkey.pem
然後吊銷證書,相當於通知 Let’s Encrypt,該證書已經無效了。
$ certbot-auto revoke --cert-path /etc/letsencrypt/live/yudadan.com/cert.pem --reason superseded
— reason 表示是吊銷證書的原因,命令運行成功後,/etc/letsencrypt/renewal、/etc/letsencrypt/archive、/etc/letsencrypt/live 下對應的文件都會被刪除。
4:你喜歡採用那種域名校驗方式
Let’s Encrypt 提供了很多插件,能夠滿足各種場景下的證書管理,對於個人網站來說,可能只有一臺 Web 伺服器,在這臺機器上申請、續期證書,然後 Web 伺服器直接引用證書即可,非常的方便。
對於大型企業來說,伺服器非常多,Web 伺服器、7層負載均衡設備都需要部署證書,一般會專門找一臺機器(中控機)運行 Certbot,一旦更新證書,就通過各種方式(最簡單的可能就是 rsync)將證書和密鑰對分發到目標伺服器上。
在申請證書的時候,Let’s Encrypt 會校驗申請者的身份,也就是要確認域名的所有權,主要有三種方式,分別是 http-01、tls-sni-01、dns-01,如果由中控機統一管理證書,建議採用 dns-01 的驗證方式。
在中控機上運行 Certbot,一般情況下無法綁定域名到這臺機器上,而 http-01、tls-sni-01 需要啟動 web 服務,所以理論上來看,這兩種校驗方式無法使用。唯一的校驗方式就是 dns-01,其實這也是最簡單、最直接的方式,如果不想手動配置域名 DNS 解析記錄,可以採用一些插件或一些 hook 來自動處理。
5:使用 staging 伺服器
申請 Let’s Encrypt 證書都是工具化的,為了防止濫用,Let’s Encrypt 對申請證書做了一定的數量限制。
如果操作不熟練,很容易陷入限制,為避免產生這種情況,可以採取兩種方式。
(1)—test-cert
在測試 Certbot 的時候,輸入該參數,表示向 staging 伺服器發送請求,staging 伺服器的限制閥值比較大,不會影響證書申請。
等熟練掌握 Certbot 操作後,再向真實伺服器發送請求。
(2)—dry-run
當使用 renew 或 certonly 操作 Certbot 的時候,加入該參數,不會真正保存證書到本地,也就是說不會陷入限制,這對測試 Certbot 操作非常有用。
6:不要輕易修改 renewal 文件。
在 Certbot 中,所有的證書管理操作都保存在 renewal 文件中,該文件相當於索引,用戶管理證書,打開 /etc/letsencrypt/renewal/simplehttps.com.conf 文件,內容如下圖:
archive_dir 等配置指向一個軟連接,指向了實際的證書。renewalparams 參數存儲了很多申請證書時用到的配置,比如 server 表示 Let’s Encrypt 的伺服器地址(v2版本),採用了 manual(手動)插件,使用 dns-01 域名驗證方式,manual_auth_hook 表示採用的 hook 文件。
這個文件對 Certbot 至關重要,比如 renew 證書的時候會用到,一般情況下不要手動修改,如果 archive 目錄下證書文件移動了,可以修改相關連接參數,然後運行下列命令,重置 renewal 文件。
$ certbot-auto update_symlinks
7:authenticators 插件和 installers 插件別混淆。
在 Certbot 中,存在兩種類型的插件,可在運行具體命令參數的時候,很多人會混淆。
下面兩條命令作用是相同的:
$ certbot-auto$ certbot-auto run install
其中 run 表示申請證書,install 表示採用 installers 插件。
下面兩條命令是相同的:
$ certbot-auto certonly $ certbot-auto run certonly
表示採用 authenticators 插件。
在我剛開始學習的時候,總是搞不清楚相關命令行參數,現在明白了嗎?
和 Let’s Encrypt 有關的文章:
推薦下我的新書《深入淺出HTTPS:從原理到實戰》,可以全面了解密碼學應用以及 HTTPS 協議。