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 進目標主機,一行指令快速安裝
curl https://get.acme.sh | sh
他會把本體以及相關設定都安裝在 ~/.acme.sh/ 之下,所以無需 root 相關權限
以後所有新增的內容也都會在此目錄下,並不會去改你系統內的東西,非常適合潔癖如我使用
另外因為目前 ACME Protocol 跟 LE 都經常在更新,所以請一定
要打開 acme.sh 自動更新功能
才不會在幾個月後 acme.sh 因為不是最新版而無法續期
下面一行指令即可打開 acme.sh 的自動更新
acme.sh --upgrade --auto-upgrade
簽 SSL 憑證
我域名大部分都是掛在 CloudFlare 託管,所以以下是使用 CloudFlare 為例
你如果是掛在其他家,請參考 acme.sh 的說明去設定,他們支援超過一百多家的 DNS API,甚至是自訂 API
而且還支援 CloudFlare 新的 API token 模式,不需要用到 Global Key,更加安全一點
首先在瀏覽器打開 CloudFlare 管理網頁: https://dash.cloudflare.com/
選擇自己想要簽憑證的域名後,在網頁右邊下面會看到「API」的欄位
Zone ID 跟 Account ID 請拷貝起來,等下會需要用到
點一下上圖的「Get your API token」繼續
開始建立專門給 acme.sh 簽憑證的 token
另外還可以加上 IP Filtering 的功能,只允許部分 IP 段能使用這個 API Token
就算別人拿到你 Token,他的 IP 不對也沒辦法使用
所以至此你應該會有三樣資料
- API Token
- Account ID
- Zone ID
然後我們就可以開始用 acme.sh 簽憑證囉!下面我們簽的是 wildcard 的域名憑證
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 工作目錄下的憑證路徑直接給這些服務使用,因為這個工作目錄可能隨時會有變化
所以我們就需要把憑證安裝到你想要的路徑中
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 會自動去幫你做續期、安裝以及後續的指定動作
設定完就可以直接忘記它,完全無人值守,舒服了~ 🖖