宁静的河边杂货店

使用 acme.sh 获取泛域名证书

Caddy 虽好,但是要让它使用 Cloudflare API 处理 DNS 验证,还非得重新编译一次。而且,词元发现 Caddy 直到目前都没有充足的第三方文档(尽管其官方文档很好),对于一些特殊需求到底该怎么写配置还是不甚清楚。因此,词元决定换用另一个可以自动续期的 SSL 申请工具,综合一下 Caddy 的功能和 NGiNX 的性能和资料优势。

很明显,这个工具就是 acme.sh

😁 这个长得很像网址的名称确实是一个网址,直接重定向到 GitHub 仓库。

📦 安装

为了不要污染用来日常操作的账号,也防止 sudo 权限被滥用,我们新建一个普通用户:

1
2
sudo useradd -m certbot
sudo passwd certbot

🤖 Certbot:你礼貌吗?

然后,使用 acme.sh 的安装脚本安装。注意这里不需要 Root 权限,安装位置也在主目录下:

1
curl https://get.acme.sh | sh -s email=you@example.com # 改为您的邮件

目前 acme.sh 已默认从 Let’s Encrypt 转为使用 ZeroSSL,后者需要邮箱地址进行注册,所以如果您打算使用默认设置,您需要添加 email=you@example.com 这一部分。如果您打算使用 Let’s Encrypt,可以忽略这个设置。

🏅 申请证书

首先要激活一下在 .bashrc 中添加的 $PATH 位置:

1
. .bashrc

如果您打算使用 Let’s Encrypt,请执行:

1
acme.sh --set-default-ca --server letsencrypt

如果您设置了邮箱,打算就用 ZeroSSL,就不必执行。

本文假设您使用 Cloudflare 托管了您的域名,并且您打算申请泛域名证书,也即这张证书可以应用于 *.yourdomain.tld 的域名。

首先访问 Token 管理页面,创建一个 Token,如下:

image-20250126141845981

image-20250126141913456

注意,这里词元选择了一个特定域名的 DNS 修改权限,如果您打算申请很多域名,既可以选择创建不同的 Token,也可以选择“All zones”,允许全局修改。这个 Token 只会显示一次,如果您需要反复使用,请记录下来。

完成之后,来到域名的 Dashboard,找到右下角的 Account ID 和 Zone ID,用于识别您的 Zone。

image-20250126142127574

记下这三个字符串之后,回到 SSH,将它们存入环境变量:

1
2
3
export CF_Token="your_cf_token"
export CF_Account_ID="your_cf_account_id"
export CF_Zone_ID="yout_cf_zone_id"

然后,执行 acme.sh 获取证书:

1
acme.sh --issue -d yourdomain.tld -d *.yourdomain.tld --dns dns_cf -k ec-256

除非您的站点需要兼容非常古老的设备和浏览器,没有理由不适用 EC-256——与 RSA 相比,EC-256 有更短的证书、更快的加密和解密速度、相似的安全性。您当然可以删除 -k ec-256 继续使用传统的 RSA 加密。

🔨 使用证书

acme.sh 不建议您直接使用位于主目录中的证书。您应当创建一个 certbot 有写入权限的全局位置目录,例如 /var/cert/yourdomain.tld 并使用 acme.sh 自动将证书同步到那儿。这也是要单独创建一个用户的原因之一:这样,您的账户就不会具有写入那个目录的权限,避免误操作删除,或者被其他程序随便访问。

使用以下命令,复制到您指定的目录:

1
acme.sh --installcert -d yourdomain.tld -d *.yourdomain.tld --fullchain-file /var/cert/yourdomain.tld/public.crt --key-file /var/cert/yourdomain.tld/private.key --ecc

acme.sh 使用 crontab 自动更新证书。如果您创建的账户有恰当的权限,当然可以添加 --reloadcmd "systemctl restart nginx" 之类的自动重启服务。

然后,您就可以在服务器里配置证书。由于您通过 acme.sh 设置了证书位置,就不需要一直更改证书文件名了。

🎆 下课

还是很简单的对吧。再见 Caddy!

Banner