藉由 dns-01 簽發 Let’s Encrypt 免費的 Wildcard 加密憑證 (SSL 證書)

Photo by Markus Spiske on Unsplash

Let’s Encrypt 在今年支援 wildcard 憑證了!

終於不用一個一個分別申請設定,一個 SSL 證書搞定 *.chineseplease.moe 的感覺真好

上次看了一下發現不能用之前無腦 http-01 challenge (不知道這該怎麼翻譯,質詢?)。得改用 dns-01 challenge 的方式進行,在過程中會需要在域名管理中新增 TXT 紀錄並藉此驗證其有效性。
實作上大概就是

  1. 安裝套件 (Dehydrated & Lexicon)
# 直接下載 dehydrated 執行文件
curl -LO https://raw.githubusercontent.com/lukas2511/dehydrated/master/dehydrate
# 搬家
mkdir /etc/dehydrated/
cp ~/dehydrated/dehydrated /etc/dehydrated/
# 增加執行權限
chmod +x /etc/dehydrated/dehydrated
# 設定憑證的域名清單,笨一點就直接建檔編輯,多域名之間用"一個空白"分開
echo "你的域名們" > /etc/dehydrated/domains.txt
# 先同意他的條款
/etc/dehydrated/dehydrated --register --accept-terms
# 用 pip 安裝 Lexicon
pip install dns-lexicon
# 抓別人的 hook 指令碼
curl -O https://raw.githubusercontent.com/AnalogJ/lexicon/master/examples/dehydrated.default.sh /etc/dehydrated
# 一樣加權限
chmod +x /etc/dehydrated/dehydrated.default.sh
  1. 設定
# 編輯 dehydrated.default.sh 這個檔案
# 找到這行
export PROVIDER=${PROVIDER:-"cloudflare"}
# 我用的是 CloudFlare ,所以這樣改
export PROVIDER=cloudflare
export LEXICON_CLOUDFLARE_USERNAME=登入的電子郵件信箱
export LEXICON_CLOUDFLARE_TOKEN=API key
  1. 產生憑證
# 靠剛剛編輯的指令碼自動操作囉
/etc/dehydrated/dehydrated --cron --hook /etc/dehydrated/dehydrated.default.sh --challenge dns-01
# 成功顯示憑證位置
/etc/dehydrated/certs/chineseplease.moe/privkey.pem, /etc/dehydrated/certs/chineseplease.moe/cert.pem, /etc/dehydrated/certs/chineseplease.moe/fullchain.pem, /etc/dehydrated/certs/chineseplease.moe/chain.pem
 + Done!
  1. 設定憑證 (Nginx)
# 編輯 Nginx 設定
listen 80;
# 改為
listen 0.0.0.0:443 ssl http2;
# 後面增加憑證位置
ssl_certificate /etc/dehydrated/certs/chineseplease.moe/fullchain.pem;
ssl_certificate_key /etc/dehydrated/certs/chineseplease.moe/privkey.pem;

重啟 nginx 後就大功告成了

參考資料