繼續 安裝 Let’s Encrypt SSL 憑證的工具

前一篇大概說了使用 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"
成功後一樣在 /etc/letsencrypt/live/nas.ssorc.tw/ 看到憑證

 

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 得以驗證成功產生憑證

 

Related posts 相關文章
dnscrypt-proxy 讓 DNS 查詢加密
More...
DNS BIND 9.16.50 最後一個版本已釋出
More...
DNS BIND 9.16 版本將 EOL
More...
在 Windows 上面 Plesk Obsidian 18.0.60 後不再維護 BIND DNS
More...

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。