利用 ACME 實現SSL證書自動化配置更新

铁皮鸭子發表於2024-10-10

最近收到騰訊雲的通知SSL證書要到期了,本想直接申請的發現現在申請的免費SSL證書有效期只有90天了,順便了解了一下原因是包括Google在內的國際頂級科技公司一直都有在推進免費證書90天有效期的建議,免費證書加密等級低,難以應對今天日益複雜的網路環境,90天一更新有助於及時發現可能存在的安全漏洞,從而降低風險。這本意是好的但是苦了我們這些的IT 人了,不過好在有自動化的SSL證書更新神器acme,可以一鍵申請SSL證書,到期也會自動更新,省去了很多麻煩。


安裝acme

首先下載安裝 acme,後面的 email修改為自己的用於收取SSL證書相關的訊息,acme 預設會安裝在~/.acme.sh/目錄下。

curl https://get.acme.sh | sh -s email=mymail@mail.com

修改SSL證書服務商

預設SSL 證書服務商為 ZeroSSL,申請過程比較容易出錯建議修改為letsencrypt,

acme.sh --set-default-ca --server letsencrypt

證書申請

證書申請過程需要一個域名驗證操作,acme 支援兩種驗證方式:http 驗證和 dns 驗證,這裡我們採用 dns 驗證方式,dns 驗證可以手動新增CNAME記錄也可以透過 dns 廠商提供的 api 進行新增,後者更方便一下,提供 dns 服務的廠商也很多這裡以 dnspod 為例進行說明。

申請DNSAPI

登入 DNSPod透過 API 金鑰建立 DNSPod Token,金鑰建立後要儲存好後續無法查詢。
image

配置DNSAPI

將上一步申請的DNSPod Token的 ID 和 Token匯入到環境變數中

export DP_Id="511111"
export DP_Key="2d111111111"

執行申請操作

使用issue命令申請證書, 引數-d 使用者指定要申請證書的域名,*.domain.cn是泛域名,domain.cn是根域名,test.domain.cn是單域名,此處需要注意要確定前面指定的SSL證書服務商是否支援申請泛域名,如果不支援就需要多次重複此步操作申請多個 SSL 證書,letsencrypt支援申請泛域名證書;引數 dns 用於指定 dns 服務廠商,執行器需要需要確保上一步的環境變數已經正確匯入,可以檢查~/.acme.sh/目錄下的account.conf檔案內容進行確認;命令執行後會透過dnsapi 自動新增CNAME記錄並進行驗證,驗證透過後會在~/.acme.sh/domain.cn 目錄生成申請好的證書。
申請過程請關注輸出資訊,存在異常時可以透過新增--debug引數輸出更多資訊以便排查。

acme.sh --issue -d domain.cn -d *.domain.cn --dns dns_dp

證書安裝

證書申請成功還需要安裝到對應的位置,需要使用--install-cert命令,這裡以 nginx 為例進行說明,-d 引數指定域名,需要和安裝的證書檔案一一對應,--key-file指定證書私鑰的安裝位置,--fullchain-file指定證書檔案的安裝位置,--reloadcmd指定證書檔案安裝完成應用的重啟命令,執行成功會提示 success,可以透過訪問自己的域名進行驗證,同時命令為新增一條自動化任務"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null用於定時自動更新 SSL 證書,可以透過crontab -l命令檢視。

acme.sh --install-cert -d domain.cn \
	--key-file       /usr/local/nginx/conf/cert/domain.cn.key  \
	--fullchain-file /usr/local/nginx/conf/cert/domain.cn.cer \
	--reloadcmd     "/usr/local/nginx/sbin/nginx -s reload"

相關網址

acme 使用說明
dnsapi 使用說明

相關文章