2024年8月11日 星期日

用 certbot 幫萬用字元 wildcard dns 申請憑證

前一陣子又把我的網域 frdm.info 上線。 [不過這個網域是我的玩具, 何時會下線或改名我也不知道。 若要把我的某些網頁加入書籤, 請大家還是要用 frdm.cyut.edu.tw <== 這部學校的伺服器比較可能長久存在。] 這次試玩 wildcard dns。 大家可以試看看 abc.frdm.info 或 隨便.frdm.info , 出現的訊息是 (網頁) "Not Found" 而不是 「找不到這個網站」。

首先在 pchome (我的 dns provider) 裡面設好兩筆 A 記錄, 一筆是 frdm.info 本身的, 另一筆是 *.frdm.info 的。

再用 certbot 同時幫 frdm.info 及 *.frdm.info 申請 HTTPS/TLS/SSL 憑證: certbot certonly --manual --preferred-challenges=dns --agree-tos -d frdm.info -d '*.frdm.info' 它會要求你在 DNS 裡面加一筆 TXT 記錄, 裡面填上它指定的一串看似亂碼的字串, 以證明你對這個網域擁有修改權。

三個月前我首次申請時, 進 pchome 改好、 等幾分鐘, 再回到 certbot 按 Enter, 就一切順利完成了。 不過這兩天被要求更新憑證時, 變得很麻煩。 不確定到底發生了什麼事, 趕快先筆記一下。 總之以下是遇到的問題及解決方式:

  1. certbot 可能會要求你設定兩組 TXT, 然後一口氣驗證這兩組。
  2. 如果驗證失敗, 重新執行時, 它給的 challenge 亂碼又會改變。
  3. 這次 dns 修改之後的傳播速度很慢, 可能要等一兩個小時。
  4. 如果有舊的 TXT 記錄, certbot 有可能會查到舊的, 結果就失敗。

所以呢:

  1. 請先執行一次, 不急著改 dns 設定, 直接按 Enter, 確認它到底要 challenge 一組還是同時兩組 TXT 字串。 (然後這一次當然失敗, TXT 字串當然就報銷啦。)
  2. 進到 pchome, 把所有舊的 _acme-challenge 的 TXT 通通刪除, 避免干擾之後的驗證。
  3. 開另一個終端機分頁, (因為要跟 certbot 使用相同的 dns server 查詢, 所以要) 在同一部伺服器上 執行: dig -t txt _acme-challenge.frdm.info | grep _acme-challenge 確認看不到上次殘留的 txt 記錄。 如果還看得到, 就再等幾小時再往下做。
  4. 重新執行 certbot ..., 在最後一次 "Press Enter to Continue" 出現時, 先讓它懸在那邊, 先進 pchome 設定 (一組或同時兩組) txt 記錄。
  5. 切換回 dig 分頁、 重複執行。 如果還沒看到新的 txt 記錄, 就先去做別的事。
  6. 等 dig 分頁出現新的 txt 記錄, 再回到 certbot 分頁按 Enter。
  7. 成功之後, 回 pchome 把 txt 記錄刪掉。 [certbot 印出來的完整訊息太長了, 請本頁面原始碼的註解。]

順利版的筆記請見 超猴崽工作日誌好幾位 cert-manager 的用戶 跟我有相同的問題, 沒人要理他們; 搜尋 「"_acme-challenge" delay」 找到 這個相同的 issue, 看不太懂, 先筆記。 根據 gandi.net 的報價, 基本款 ("標準") 的 "萬用字元" SSL 憑證, 每年 $6300。 省錢爽耶!

有了憑證, 當然也要啟用 ssl: a2enmod ssl

再來要設定: 每個 VirtualHost 有自己的 VirtualDocumentRoot 。 根據 這則解答, 我的 apache2 設定檔裡加了這一段:

<VirtualHost _default_:443>
    ServerAlias *.frdm.info
    ServerAdmin ckhung@cyut.edu.tw
    VirtualDocumentRoot /var/www/%1/
    SSLEngine on
    SSLCertificateFile  /etc/letsencrypt/live/frdm.info/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/frdm.info/privkey.pem
    ...
</VirtualHost>

如此一來, 訪客造訪 https://scatplot.frdm.info 時, apache 就會拿 /var/www/scatplot/index.html 給他看; 造訪 https://potluckmap.frdm.info/ 時, apache 就會拿 /var/www/potluckmap/index.html 給他看。 只差幾個 mv 指令, 我一下子變成坐擁多站的站長 :-)

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。