用acme.sh自動部署功能變數名稱證書 安裝ACME 目前使用量最大的免費SSL證書就是Let’s Encrypt,自2018-03開始,Let’s Encrypt官方發佈上線了免費的SSL泛功能變數名稱證書,目前通過DNS方式獲取比較快,國內可以通過鵝雲的DNSPod功能變數名稱API或者貓雲功能變數名稱API自動簽發Let’ ...
用acme.sh自動部署功能變數名稱證書
安裝ACME
目前使用量最大的免費SSL
證書就是Let’s Encrypt
,自2018-03
開始,Let’s Encrypt
官方發佈上線了免費的SSL
泛功能變數名稱證書,目前通過DNS
方式獲取比較快,國內可以通過鵝雲的DNSPod
功能變數名稱API
或者貓雲功能變數名稱API
自動簽發Let’s Encrypt
泛功能變數名稱證書。因為鵝雲使用的就是DNSPod
功能變數名稱,並且鵝雲和DNSPod的賬號是打通的,可以使用wx
直接掃碼登錄。下文需要對鵝雲和DNSPod
進行操作,為了簡化證書申請過程,需要提前安裝acme.sh。acme.sh
實現了acme
協議,可以從Let’s Encrypt
生成免費的證書,自動創建cron
任務, 每天零點自動檢測所有的證書,如果發現證書快過期了,需要更新,則acme.sh
會自動更新證書,安裝過程不會污染已有的系統任何功能和文件,所有的修改都限制在安裝目錄中。
先進行依賴下載和更新。如果伺服器是CentOS
系統,使用下麵的命令:
yum update && yum install curl -y && yum install cron -y && yum install socat -y
如果伺服器是Debian/Ubuntu
系統,則使用下麵的命令:
apt-get update && apt-get install curl -y && apt-get install cron -y && apt-get install socat -y
1. 安裝 acme.sh
安裝很簡單, 一個命令:
curl https://get.acme.sh | sh -s email=yourEmail
配置自動解析
以 dnspod 為例, 你需要先登錄到 dnspod 賬號, 生成你的 api id 和 api key, 都是免費的。
然後配置:
export DP_Id="apiid"
export DP_Key="apikey"
2. 生成證書
手動 dns 方式, 手動在功能變數名稱上添加一條 txt 解析記錄, 驗證功能變數名稱所有權。
這種方式的好處是, 你不需要任何伺服器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證. 壞處是,如果不同時配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動更新證書,每次都需要手動再次重新解析驗證功能變數名稱所有權。
~/.acme.sh/acme.sh --issue --dns -d zhaifanhua.com -d *.zhaifanhua.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
然後, acme.sh 會生成相應的解析記錄顯示出來, 你只需要在你的功能變數名稱管理面板中添加這條 txt 記錄即可.
驗證解析生效:
nslookup -q=txt _acme-challenge.zhaifanhua.com
等待解析完成之後, 重新生成證書:
~/.acme.sh/acme.sh --force --renew -d zhaifanhua.com -d *.zhaifanhua.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
3. copy/安裝 證書
前面證書生成以後, 接下來需要把證書 copy 到真正需要用它的地方:
註意, 預設生成的證書都放在安裝目錄下: ~/.acme.sh/
, 請不要直接使用此目錄下的文件, 例如: 不要直接讓 nginx/apache 的配置文件使用這下麵的文件. 這裡面的文件都是內部使用, 而且目錄結構可能會變化。
正確的使用方法是使用 --install-cert
命令,並指定目標位置, 然後證書文件會被copy到相應的位置, 例如:
Nginx:
執行命令,這裡指定的所有參數都會被自動記錄下來, 併在將來證書自動更新以後, 被再次自動調用。
配置 Nginx 文件:
這裡我將其配置到了 /home/ssl 目錄下,zhaifanhua.com_key.key 和 zhaifanhua.com_cert.pem 分別是私匙和證書名稱,可自定義。
~/.acme.sh/acme.sh --install-cert -d zhaifanhua.com -d *.zhaifanhua.com --key-file /home/ssl/zhaifanhua.com_key.key --fullchain-file /home/ssl/zhaifanhua.com_fullchain.cer --reloadcmd "service nginx force-reload"
(一個小提醒, 這裡用的是
service nginx force-reload
, 不是service nginx reload
, 據測試,reload
並不會重新載入證書, 所以用的force-reload
)Nginx 的配置
ssl_certificate
使用/etc/nginx/ssl/fullchain.cer
,而非/etc/nginx/ssl/<domain>.cer
,否則 SSL Labs 的測試會報Chain issues Incomplete
錯誤。
--install-cert
命令可以攜帶很多參數, 來指定目標文件. 並且可以指定 reloadcmd, 當證書更新以後, reloadcmd會被自動調用,讓伺服器生效。詳細參數請參考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
顯示 Reload success 表示成功!
4. 查看已安裝證書信息
查看/刪除證書
查看證書
~/.acme.sh/acme.sh --list
刪除證書
~/.acme.sh/acme.sh remove <SAN_Domains>
查看信息
~/.acme.sh/acme.sh --info -d zhaifanhua.com -d *.zhaifanhua.com
5. 更新證書
目前證書在 60 天以後會自動更新, 你無需任何操作. 今後有可能會縮短這個時間, 不過都是自動的, 你不用關心.
請確保 cronjob 正確安裝, 看起來是類似這樣的:
crontab -l
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
6. 關於修改ReloadCmd
目前修改ReloadCmd
沒有專門的命令,可以通過重新安裝證書來實現修改reloadCmd
的目的。 此外,安裝證書後,相關信息是保存在~/.acme.sh/example.com/example.conf
文件下的,內容就是acme.sh --info -d example.com
輸出的信息,不過ReloadCmd
在文件中使用了Base64編碼。理論上可以通過直接修改該文件來修改ReloadCmd
,且修改時,無需Base64編碼,直接寫命令原文acme.sh
也可以識別。 不過,example.conf
文件的位置和內容格式以後可能會改變!example.conf
一直都是內部使用, 後面有可能會改為用 sqlite 或者mysql 格式存儲. 所以一般不建議自己修改。
7. 更新 acme.sh
目前由於 acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步.
升級 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手動升級, 可以開啟自動升級:
acme.sh --upgrade --auto-upgrade
之後, acme.sh 就會自動保持更新了.
你也可以隨時關閉自動更新:
acme.sh --upgrade --auto-upgrade 0
8. 出錯怎麼辦:
如果出錯, 請添加 debug log:
acme.sh --issue ..... --debug
或者:
acme.sh --issue ..... --debug 2