Miao's blog

acme.sh 的使用

哪個男孩不想要一個屬於自己的 SSL 證書?借助 acme.sh,輕鬆開啟 TLS。acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。

因為一些安全原因拋棄了寶塔面板,習慣了視窗化操作後重回純命令自然有點不習慣。但作為一個合格的打工人,命令行操作應當是必備技能。本文參考 acme.sh 的官方 Wiki 和本人日常使用情況。

首先,安裝 acme.sh:

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

acme.sh 將安裝至 $HOME/.acme.shacme.sh 的自動續期依賴於 cron。

我常用的 acme.sh 證書申請模式只有兩種:HTTP 模式和 DNS-api 模式。

HTTP 模式

HTTP 模式當然是使用的最多的模式,簡單方便,足夠傻瓜。此模式需要在網站根目錄下放置一個文件,來驗證域名所有權,完成驗證後即可生成證書。其基本命令如下:

~/.acme.sh/acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

如果使用了 Nginx 或者 Apache,acme.sh 可以自動從 Nginx/Apache 的配置中獲取路徑,無須指定:

~/.acme.sh/acme.sh --issue -d mydomain.com --nginx ## or apache

如果沒有運行任何 web 服務並且 80 端口是空閒的,acme.sh 還可以臨時創建一個 webserver 並 listen 80 端口,完成驗證:

~/.acme.sh/acme.sh --issue -d mydomain.com --standalone -k ec-256

以上簽發的均為普通 RSA 證書。如果需要 ECC 證書,則需要增加一個 parameter。如:

~/.acme.sh/acme.sh --issue --keylength ec-256 -d mydomain.com

DNS-api 模式

透過 HTTP 模式申請證書和續期都方便快捷,可以完全自動。但如果 80 端口被佔用或者被封禁(如 NAT 或者家庭寬帶)則無法使用。這時候可以選擇使用 DNS-api 模式。請注意,在使用前務必確認自己的域名/DNS 服務商被 acme.sh 支持。

我使用 Cloudflare 作為 DNS 解析服務商。以下均以 Cloudflare 為例。透過 api,acme.sh 可以自動在我的 Cloudflare 帳戶中添加 txt 解析用作證書驗證。

首先需要獲取 CF API Key,並告訴 acme.sh

export CF_Key=“your_cf_global_api_key”
export CF_Email=“顧名思義”

Api 將被 acme.sh 紀錄,用於未來的續期。指定 api 後,通過如下命令申請證書:

~/.acme.sh/acme.sh --issue --dns dns_cf -d mydomain.com ## RSA
## 或者
~/.acme.sh/acme.sh --issue --dns dns_cf --keylength ec-256 -d mydomain.com ## ECC

證書的安裝

證書生成以後,需要把證書 copy 到真正需要用它的路徑。

默認的生成證書都放在安裝目錄下: ~/.acme.sh/,但不應該被直接使用。這裡面的文件都是內部使用,而且目錄結構可能會變化。

~/.acme.sh/acme.sh --install-cert -d example.com \
--keypath /path/to/keyfile/key.key \
--fullchainpath /path/to/fullchain/certfile/fullchain.crt \
--ecc ## ECC

--install-cert 命令可以攜帶很多參數來指定目標文件。並且可以指定 reloadcmd,當證書更新以後,reloadcmd 會被自動調用,讓服務器生效。