前一篇大概說了使用 dehydrated 或 certbot 來更新 Let’s Encrypt SSL 憑證
這次細說一下 certbot
certbot 我主要用來更新 Synology NAS Web 介面的憑證,因為 NAS 沒有對外,所以要用 DNS TXT 記錄做驗證
開始產生 ↓
certbot certonly \ -d nas.ssorc.tw \ --preferred-challenges dns \ --manual
如果不熟可以先用 Let’s Encrypt 的測試環境 (不然正式環境有連線限制)
--server https://acme-staging-v02.api.letsencrypt.org/directory
正式叫 ↓
--server https://acme-v02.api.letsencrypt.org/directory
(接下來它的流程照前篇文章一樣)
因為是用 DNS TXT 做驗證 ,所以要讓記錄長這樣子 ↓
dig _acme-challenge.nas.ssorc.tw. TXT
_acme-challenge.nas.ssorc.tw. 777 IN TXT "vbe3j3tqAPRSb1DyKZPWn0UTLrnbQJw8HNSeQw5FC4E"
在更新 DNS TXT 時,如果有 API 就更方便了
我的網域是用 Gandi ,它有 API (這裡取 API KEY) 可以直接把驗證值餵過去
api_key="xxxxxxxxxxxxxxxxxxxxxxxxx" ttl="777" domain="ssorc.tw" type="_acme-challenge.nas/TXT" value="TXT value .......mArBr2jJvnx1wnG468fEOpk (certbot 產生的)" curl -X PUT \ https://api.gandi.net/v5/livedns/domains/$domain/records/$type \ -H "authorization: Apikey $api_key" \ -H 'content-type: application/json' \ -d "{\"rrset_values\":[\"$value\"],\"rrset_ttl\":$ttl}"
到這裡就產生完憑證了
但是…
前面的方式並沒有完全自動化,會有互動畫面,如果要做排程就不行了
所以用下面提供的方式跑起來就可以一氣呵成
certbot certonly \ -d nas.ssorc.tw \ --preferred-challenges dns \ --manual \ --manual-auth-hook /path/update_dns_record.sh \ --agree-tos \ --register-unsafely-without-email \ --server https://acme-staging-v02.api.letsencrypt.org/directory
這邊多了 certbot 的 –manual-auth-hook 參數,後面接著 script 檔 (一定要給它執行權限 chmod +x)
它 hook 有幾個預設變數可帶入 script 裡面使用
CERTBOT_DOMAIN: The domain being authenticated CERTBOT_VALIDATION: The validation string CERTBOT_TOKEN: Resource name part of the HTTP-01 challenge (HTTP-01 only) CERTBOT_REMAINING_CHALLENGES: Number of challenges remaining after the current challenge CERTBOT_ALL_DOMAINS: A comma-separated list of all domains challenged for the current certificate
/PATH/update_dns_record.sh 的內容就是前面 API 的內容
但要把 value 改成 hook 的變數 ↓
value="$CERTBOT_VALIDATION"
PS: certbot hook 變數實際內容長這樣子
CERTBOT_DOMAIN=nas.ssorc.tw CERTBOT_VALIDATION=1AyRFhKrKsZDt-bH7HKLR9jgySvBoKQrmDRc4C3QMfk CERTBOT_TOKEN= CERTBOT_REMAINING_CHALLENGES=0 CERTBOT_ALL_DOMAINS=nas.ssorc.tw
不過,如果再跑一次上面 certbot 指令,卻會有問題
它除了會說尚未到可續約時間 (倒數前 30 天內才可以)
Certificate not yet due for renewal
還會多了互動模式,要你選擇續約 1、或重新產生 2
可以用另一方式,直接 ↓ (這個可以放在 crontab 裡了)
certbot renew
它會去讀取設定 (第一次保留下來的)
/etc/letsencrypt/renewal/nas.ssorc.tw.conf
# renew_before_expiry = 30 days version = 1.22.0 archive_dir = /etc/letsencrypt/archive/nas.ssorc.tw cert = /etc/letsencrypt/live/nas.ssorc.tw/cert.pem privkey = /etc/letsencrypt/live/nas.ssorc.tw/privkey.pem chain = /etc/letsencrypt/live/nas.ssorc.tw/chain.pem fullchain = /etc/letsencrypt/live/nas.ssorc.tw/fullchain.pem # Options used in the renewal process [renewalparams] account = dd81XXXXXXXXXXXXXXXXXXXXXX pref_challs = dns-01, server = https://acme-staging-v02.api.letsencrypt.org/directory authenticator = manual manual_auth_hook = /path/update_dns_record.sh
最後,記得 Let’s Encrypt SSL 的正式環境與測試環境連結是不同的
certbot 也可以使用網站連結路徑作驗證
certbot certonly \ -d ssorc.tw \ --webroot \ --webroot-path /path/ssorc.tw/html/ \ --agree-tos \ --register-unsafely-without-email \ --server https://acme-staging-v02.api.letsencrypt.org/directory
給 –webroot-path 參數,當執行 certbot 時會在過程中在網站資料放置的路徑裡產生驗證碼,透過瀏覽 http://ssorc.tw/.well-known/acme-challenge/XXXXXXXXXXXXXXX 得以驗證成功產生憑證
留言