# 使用 acme.sh 申請及自動更新 SSL 憑證
## 1. 安裝 acme.sh
以下操作建議使用網站服務實際運行的系統帳號執行;若由 `root` 管理憑證,則使用 `root` 執行。
“`bash
curl https://get.acme.sh | sh -s email=your-email@example.com
“`
安裝完成後,重新載入 Shell 環境:
“`bash
source ~/.bashrc
“`
確認是否安裝成功:
“`bash
acme.sh –version
“`
acme.sh 安裝時會:
* 安裝至 `~/.acme.sh/`
* 建立 `acme.sh` 指令別名
* 自動建立每日執行的憑證更新排程
安裝完成後若找不到 `acme.sh` 指令,也可以直接執行:
“`bash
~/.acme.sh/acme.sh –version
“`
acme.sh 官方目前仍將 **ZeroSSL 設為預設 CA**。本教學改用較常見的 **Let’s Encrypt**:
“`bash
acme.sh –set-default-ca –server letsencrypt
“`
—
## 2. 申請前準備
申請憑證前請確認:
1. 網域已正確解析至目前伺服器。
2. 外部可以透過 TCP Port 80 存取網站。
3. 網站根目錄存在且 acme.sh 有寫入權限。
4. 網站不可阻擋 `/.well-known/acme-challenge/` 路徑。
例如網站根目錄:
“`text
/var/www/html
“`
—
## 3. 申請單一網域憑證
“`bash
acme.sh –issue \
-d domain.com \
-w /var/www/html
“`
目前 acme.sh 預設簽發的是 **ECC P-256 憑證**,不是傳統 RSA 憑證。
—
## 4. 申請多網域憑證
所有網域必須解析至目前伺服器,並能透過相同網站根目錄完成驗證。
“`bash
acme.sh –issue \
-d domain.com \
-d www.domain.com \
-d dev.domain.com \
-w /var/www/html
“`
第一個 `-d` 會作為主要網域。
—
## 5. 將憑證安裝至正式路徑
憑證申請完成後,acme.sh 會將內部檔案存放在:
“`text
~/.acme.sh/domain.com_ecc/
“`
> 不要直接讓 Nginx 或 Apache 使用 `~/.acme.sh/` 內的憑證。這是 acme.sh 的內部管理目錄,未來目錄結構可能變更。應使用 `–install-cert` 將憑證複製到正式路徑。
### Nginx
建立正式憑證目錄:
“`bash
mkdir -p /etc/nginx/ssl/domain.com
“`
安裝憑證:
“`bash
acme.sh –install-cert \
-d domain.com \
–ecc \
–key-file /etc/nginx/ssl/domain.com/private.key \
–fullchain-file /etc/nginx/ssl/domain.com/fullchain.pem \
–reloadcmd “systemctl reload nginx”
“`
Nginx 設定:
“`nginx
ssl_certificate /etc/nginx/ssl/domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/domain.com/private.key;
“`
檢查並重新載入設定:
“`bash
nginx -t && systemctl reload nginx
“`
### Apache
建立正式憑證目錄:
“`bash
mkdir -p /etc/apache2/ssl/domain.com
“`
安裝憑證:
“`bash
acme.sh –install-cert \
-d domain.com \
–ecc \
–key-file /etc/apache2/ssl/domain.com/private.key \
–fullchain-file /etc/apache2/ssl/domain.com/fullchain.pem \
–reloadcmd “systemctl reload apache2”
“`
Apache 設定:
“`apache
SSLCertificateFile /etc/apache2/ssl/domain.com/fullchain.pem
SSLCertificateKeyFile /etc/apache2/ssl/domain.com/private.key
“`
檢查並重新載入設定:
“`bash
apachectl configtest && systemctl reload apache2
“`
`–reloadcmd` 非常重要。憑證更新後,acme.sh 會再次複製憑證並執行此指令,讓網站服務載入新憑證。
—
## 6. 查看自動更新排程
安裝 acme.sh 時通常已經自動建立 Cron 排程。
查看目前排程:
“`bash
crontab -l
“`
排程內容通常類似:
“`cron
0 0 * * * “/root/.acme.sh/acme.sh” –cron –home “/root/.acme.sh” > /dev/null
“`
實際執行時間和家目錄可能不同。
acme.sh 會每日檢查憑證,但只有在憑證進入更新時間時才會進行更新。官方目前也支援依 CA 提供的 ARI 更新時段決定更新時間。
手動測試自動更新流程:
“`bash
acme.sh –cron –home ~/.acme.sh
“`
查看指定網域的下一次更新時間:
“`bash
acme.sh –info -d domain.com
“`
—
## 7. 手動強制更新憑證
因為目前預設是 ECC 憑證,因此需加入 `–ecc`:
“`bash
acme.sh –renew \
-d domain.com \
–ecc \
–force
“`
更新完成後,先前透過 `–install-cert` 設定的憑證路徑和 `reloadcmd` 會自動執行。
—
## 8. 更新 acme.sh
手動更新至最新版:
“`bash
acme.sh –upgrade
“`
啟用 acme.sh 自動更新:
“`bash
acme.sh –upgrade –auto-upgrade
“`
停用自動更新:
“`bash
acme.sh –upgrade –auto-upgrade 0
“`
官方建議持續使用最新版 acme.sh。
—
## 完整指令範例
以下以 Nginx、`domain.com` 及 `/var/www/html` 為例:
“`bash
# 安裝
curl https://get.acme.sh | sh -s email=your-email@example.com
source ~/.bashrc
# 使用 Let’s Encrypt
acme.sh –set-default-ca –server letsencrypt
# 申請憑證
acme.sh –issue \
-d domain.com \
-d www.domain.com \
-w /var/www/html
# 建立正式憑證目錄
mkdir -p /etc/nginx/ssl/domain.com
# 安裝憑證並設定更新後重新載入 Nginx
acme.sh –install-cert \
-d domain.com \
–ecc \
–key-file /etc/nginx/ssl/domain.com/private.key \
–fullchain-file /etc/nginx/ssl/domain.com/fullchain.pem \
–reloadcmd “systemctl reload nginx”
# 檢查 Nginx
nginx -t && systemctl reload nginx
# 查看自動更新排程
crontab -l
“`
OpenAi 官方的Strea...