最佳無人值守的 Let's Encrypt 簽 SSL 憑證與續期方案

Let’s Encrypt 真是一家佛心公司,從 2015 年 12 月開始就對外提供免費的 SSL 憑證服務

至今已經是網路上最常見的憑證機構之一了!

剛開始使用 LE 服務時候,一直是使用 LE 官方推薦的 Certbot 來獲取簽名

去年的時候意外在某個項目看到推薦使用 acme.sh 來簽憑證,於是我當時也跟著換

一用也超過半年以上了,異常穩定 100% 無人值守,至今也沒出問任何問題,非常推薦~

有時候臨時跑個 docker 之類小服務跟反代,會直接用 CaddyServer 或者 Traefik 起一個自動服務出來用

但是用 nginx 或者打算把憑證用在其他用途上,就還是推薦用 acme.sh 來自動續期比較好

acme.sh 強大的優勢如下:

  • 100% 使用 Shell 語言撰寫,完整支援 ACME Protocol
  • 本體無任何依賴,無需 Python 環境或者安裝 LE 客戶端
  • 支援上百家 DNS API 驗證方式
  • 全自動完成簽憑證、續期跟安裝憑證,以及可以自訂簽憑證後的指定工作
  • 無需 roots 或 sudo 權限

下面快速記錄一下安裝與設定過程,我環境是使用 debian + CloudFlare DNS

安裝 acme.sh

ssh 進目標主機,一行指令快速安裝

1
curl  https://get.acme.sh | sh

他會把本體以及相關設定都安裝在 ~/.acme.sh/ 之下,所以無需 root 相關權限

以後所有新增的內容也都會在此目錄下,並不會去改你系統內的東西,非常適合潔癖如我使用

另外因為目前 ACME Protocol 跟 LE 都經常在更新,所以請一定要打開 acme.sh 自動更新功能

才不會在幾個月後 acme.sh 因為不是最新版而無法續期

下面一行指令即可打開 acme.sh 的自動更新

1
acme.sh  --upgrade  --auto-upgrade

簽 SSL 憑證

我域名大部分都是掛在 CloudFlare 託管,所以以下是使用 CloudFlare 為例

你如果是掛在其他家,請參考 acme.sh 的說明去設定,他們支援超過一百多家的 DNS API,甚至是自訂 API

而且還支援 CloudFlare 新的 API token 模式,不需要用到 Global Key,更加安全一點

首先在瀏覽器打開 CloudFlare 管理網頁: https://dash.cloudflare.com/

選擇自己想要簽憑證的域名後,在網頁右邊下面會看到「API」的欄位

/media/2020/05/9ztOkobh341FmT2kny50.png

Zone ID 跟 Account ID 請拷貝起來,等下會需要用到

點一下上圖的「Get your API token」繼續

/media/2020/05/M5gtyOYf21iLLBDSY952.png

開始建立專門給 acme.sh 簽憑證的 token

/media/2020/05/YnVmPioF36168QXtyy53.png

/media/2020/05/PdLZjggW24TaVM8sPD55.png

👆 如上圖設定即可

另外還可以加上 IP Filtering 的功能,只允許部分 IP 段能使用這個 API Token

就算別人拿到你 Token,他的 IP 不對也沒辦法使用

/media/2020/05/WEqj6rqo52aYFKX08q12.png

/media/2020/05/PoYDklGn28gI6p4gYO13.png

👆 如上圖,最後按下拷貝的按鈕

所以至此你應該會有三樣資料

  • API Token
  • Account ID
  • Zone ID

然後我們就可以開始用 acme.sh 簽憑證囉!下面我們簽的是 wildcard 的域名憑證

1
2
3
4
export CF_Token="zzzzzzzzzzzzzzzz"
export CF_Account_ID="xxxxxxxxxxx"
export CF_Zone_ID="oooooooooooo"
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'

以上指令輸入完稍等片刻,一個 LE 提供的佛心 SSL 憑證就簽下來了

簽下來的憑證跟 CloudFlare ID 與 Token 都會被存在 ~/.acme.sh/ 裡面

以後續期時候 acme.sh 會自動讀取出來使用

安裝 SSL 憑證

預設簽下來的憑證都是安裝在 ~/.acme.sh/ 資料夾下面

我們可能會有其他用途,例如憑證要給 nginx 網站伺服器、AdGuard Home 或者其他加密服務使用

不建議直接把 acme.sh 工作目錄下的憑證路徑直接給這些服務使用,因為這個工作目錄可能隨時會有變化

所以我們就需要把憑證安裝到你想要的路徑中

1
2
3
4
acme.sh --installcert -d example.com \
--key-file /path/to/keyfile.pem  \
--fullchain-file /path/to/fullchain.cer \
--reloadcmd "sudo service nginx force-reload"

上面指令第四行是安裝憑證後會自動去執行的指令

如上指令就是安裝完以後,會自動去強制重新啟動 nginx 伺服器,讓他讀取新憑證

這部分可以是一行指令或者是一個你事先編輯好的 sh 執行檔,像是如果你有多台伺服器

就可以寫個 sh 執行檔,除了強制重新啟動 nginx 以外,再另外幫你把憑證 scp 拷貝到其他機器上也是沒問題的

如此以後每 60 天 acme.sh 會自動去幫你做續期、安裝以及後續的指定動作

設定完就可以直接忘記它,完全無人值守,舒服了~ 🖖