使用 acme.sh 申请 SSL 证书
之前很长一段时间,这个博客一直在用云服务商提供的免费 SSL 证书,那个证书有一年有效期,也即一年只需要申请部署一次,因此全手动操作也不算麻烦,但现在免费 SSL 证书的有效期统一缩短为 3 个月了,意味着每 3 个月就要操作一次,这就让手动申请和部署变得麻烦起来了。
最近,我尝试了一下使用 acme.sh 申请 SSL 证书的方法,确实方便了不少,在这里记录一下。
安装 acme.sh
acme.sh 是一个实现 ACME 协议的脚本,主要用途是申请或更新免费 SSL 证书。运行以下命令即可安装:
curl https://get.acme.sh | sh -s [email protected]
更多安装方式可见官方文档: https://github.com/acmesh-official/acme.sh。
acme.sh 会被安装在 ~/.acme.sh
目录下。
手动申请证书
安装好 acme.sh 后,可以用以下命令申请证书:
acme.sh --issue --dns -d mydomain.com -d "*.mydomain.com" --yes-I-know-dns-manual-mode-enough-go-ahead-please
记得把其中的 mydomain.com
换成你自己的域名。
上面的代码中,我申请了泛域名证书,所以同时添加了 mydomain.com
和 *.mydomain.com
域名。需要注意的是, *.mydomain.com
不包含 mydomain.com
,如果你希望证书除了包含 www.mydomain.com
这样的二级域名,也包含 mydomain.com
的话,记得把 mydomain.com
也加上。
另外, *.mydomain.com
也不包含更深的层级,比如它包含 home.mydomain.com
,但不包含 app.home.mydomain.com
。如果你需要更深层级的泛域名,需要把对应的域名也填上。
还需要注意的是最后一个参数 --yes-I-know-dns-manual-mode-enough-go-ahead-please
。acme.sh 更希望用户使用自动申请证书的方式(见下一小节),如果你确实需要手动申请,需加上这个参数,否则命令不会正常执行。
如果一切顺利,acme.sh 命令会输出两段 TXT 信息,需要你 手动添加到对应域名的 DNS 解析中,以验证你确实对这个域名拥有权限。在证书申请完成之后,可以删除对应的 TXT 记录。
登录域名服务商(比如阿里云)后台,在域名解析中添加上对应的 TXT 记录,然后再运行以下命令,即可生成证书:
acme.sh --renew -d mydomain.com -d "*.mydomain.com" --yes-I-know-dns-manual-mode-enough-go-ahead-please
证书会被保存在 ~/.acme.sh/
目录下,包含以下四个文件:
-
mydomain.com.cer
证书 -
mydomain.com.key
密钥 -
ca.cer
-
fullchain.cer
全链路证书
其中在网站场景主要使用 fullchain.cer
文件和 mydomain.com.key
文件。
自动申请证书
可以看到,上面手动申请的步骤,主要的手动操作就是要为域名添加 TXT 记录以验证域名权限,acme.sh 支持让这个步骤自动化,即自动添加 TXT 记录,并在验证完成之后自动删除对应的记录。
以阿里云为例(如果你的域名是在阿里云注册并解析的),首先需要去阿里云控制台获取一个 AccessKey,建议专门设置一个 RAM 用户,只开通 DNS 权限。
得到 AccessKey 之后,在命令行中执行以下命令:
export Ali_Key="key"
export Ali_Secret="secret"
随后再执行以下命令,即可自动申请或更新证书了:
acme.sh --issue --dns dns_ali -d mydomain.com -d "*.mydomain.com"
注意 --dns
参数后面的值为 dns_ali
。
一切顺利的话,证书申请会自动完成,并被保存在 ~/.acme.sh/
目录下。
其他各大域名服务商的自动申请方式类似,具体可参见官方文档。
一些注意点
如果你使用了自动申请,AccessKey 会被明文保存在 ~/.acme.sh/account.conf
文件内,如果介意,可在申请完之后修改这个文件并删除对应的 AccessKey。
另外,使用自动申请后,acme.sh 会添加一条定时任务,每天自动检查证书是否需要更新。可运行以下命令查看当前系统的定时任务列表:
crontab -l
现在 acme.sh 默认使用的证书颁发机构是 ZeroSSL,还有一些其他可选机构,比如 Let's Encrypt。可以用 --set-default-ca
修改默认证书颁发机构,比如:
acme.sh --set-default-ca --server letsencrypt
我没有修改 CA,在使用默认的 ZeroSSL 的证书,目前来看暂时没有遇到什么问题。
除了自动申请证书外,大部分网络服务商也支持自动上传 SSL 证书,不过这部分我还没有研究,后续如果觉得值得记录,会另外写文分享。