向服務商購買一張常見的 DV 通配符 SSL 證書,通常每年價格在數百至一千多元人民幣不等;若名下有多個域名需要使用證書,總費用每年可能達到數千元。
在當前強調降本增效的環境下,若評估後認為免費證書能夠滿足需求,小公司和個人網站即可節省相應成本。
Let’s Encrypt 簡介
Let’s Encrypt 是一家免費、開放、自動化的公益性證書頒發機構(CA),由互聯網安全研究組(ISRG)運作,屬於非營利組織。其目標是推廣 HTTPS 的應用,為構建更安全、尊重隱私的互聯網提供免費而便捷的支持。
操作方法
根據不同使用環境,Let’s Encrypt 提供多種驗證與獲取證書的方式。常用工具是 Certbot,詳見文檔:https://eff-certbot.readthedocs.io/en/stable/。
在部分環境中,可配置工具定期自動續期,減少維護工作。
由於服務器環境較為老舊,且需要將證書上傳至阿里雲並部署到多個雲服務,本文暫採用“本地生成證書—手動上傳與更新”的方式。
0x01 在本地生成證書
本文使用 Docker 運行 Certbot,參見文檔:https://eff-certbot.readthedocs.io/en/stable/install.html#alternative-1-docker。
生成通配符證書的示例命令如下:
docker run -it --rm --name certbot \
-v '/Users/mazhuang/some/path/letsencrypt:/etc/letsencrypt' \
certbot/certbot certonly \
--preferred-challenges dns \
--manual \
--server https://acme-v02.api.letsencrypt.org/directory \
--key-type rsa --rsa-key-size 2048
--preferred-challenges dns使用 DNS 方式進行域名驗證;--manual以交互式方式進行詢問與操作;--key-type rsa --rsa-key-size 2048生成 2048 位 RSA 私鑰(部分阿里雲服務不支持默認的 ECC 證書)。
執行後會依次詢問郵箱、協議授權、域名等信息,隨後提示添加 DNS TXT 記錄以完成域名所有權驗證,按提示操作即可。
生成成功後,證書與私鑰保存在掛載的本地目錄中,例如上述命令中的 /Users/mazhuang/some/path/letsencrypt/archive/{domain name}。各文件的説明可參考:https://eff-certbot.readthedocs.io/en/stable/using.html#where-certs。
0x02 上傳和部署證書
將證書上傳到阿里雲的數字證書管理服務。可使用其一鍵部署功能(付費),或在各雲服務中手動選擇使用該證書(免費),按需取用。
0x03 定期更新證書
Let’s Encrypt 頒發的證書有效期為 90 天,建議在到期前 30 天內更新。可重複步驟 0x01 生成新證書,然後上傳並部署。
注意事項
部分極為老舊的平台有可能不支持 Let’s Encrypt 頒發的證書,建議評估後再決定是否使用,具體的兼容情況可以參考:https://letsencrypt.org/zh-cn/docs/certificate-compatibility/ 。
比如我這邊就遇到了因為使用的是 JDK 8 的低於 141 的版本,部署完證書後,發現 xxl-job 定時任務執行器沒有註冊上,報錯 sun.security.validator.ValidatorException: PKIX path building failed。
解決方法:
- 下載 ISRG Root X1 證書
在這裏可以找到: https://letsencrypt.org/certificates/
cd /opt
get https://letsencrypt.org/certs/isrgrootx1.pem
- 導入證書到 JDK 的 cacerts 中
keytool -trustcacerts -keystore "/opt/jdk/jre/lib/security/cacerts" -storepass changeit -noprompt -importcert -alias lets-encrypt-x1 -file "/opt/isrgrootx1.pem"
- 重啓服務
小結
以上步驟簡單、成本為零。對小公司和個人網站而言,是節省 SSL 證書費用的可行方案。
若環境允許,建議配置自動化續期,進一步降低維護成本,按需採用。
參考鏈接
- https://letsencrypt.org/zh-cn/
- https://eff-certbot.readthedocs.io/en/stable/