Let's Encrypt 免费泛域名通配符证书申请
最近想要给网站整一个通配符证书,不然每加一个子域名,都要手动去申请一个域名证书,一年有效期过后还要重新申请和更新,非常不方便。某里云和某讯云的通配符证书申请,都是需要缴纳蛮贵的费用的,对个人开发者来说实在没有必要。好在 Let's Encrypt 提供了免费的通配符证书,虽然有效期只有2-3个月,但是通过脚本配置,可以实现自动循环更新,节省了大量和申请、更新证书有关的烦恼。
今天梳理一下使用一个第三方脚本 acme.sh 来进行证书申请和更新的过程。相关操作也可以参照 https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E (opens new window)
# 1) 安装脚本
可以到 acme.sh 的 Github 主页 https://github.com/acmesh-official/acme.sh (opens new window),按流程进行脚本安装。
curl https://get.acme.sh | sh -s [email protected]
邮箱替换成自己的邮箱。
安装之后需要重开一下终端,才能使用 acme.sh 命令。或者就直接到你自己的 ~/.acme.sh/ 目录下,每次命令使用 ./acme.sh xxxxxxx
也可以。
# 2)生成证书
# 配置 DNS API 自动验证
签发证书需要验证你对这个域名的所有权。一种方式是可以通过 http 验证,也就是你在网站根目录下放置一个独有的文件,如果通过网址能访问到这个文件,则说明域名确实归你所有。这种方式需要你的域名解析到服务器上。
另一种方式是通过 DNS 解析记录来验证。可以手动给域名按要求添加 DNS 解析记录,但之后无法自动更新。所以这里建议通过 Automantic DNS API 来做,脚本可以自动帮你添加和删除 DNS 解析记录,用来完成验证,并且之后可以自动更新证书。
目前 acme.sh 支持多家域名解析商的自动验证,套路和良心云的也都支持. 以我用的良心云为例,在 DNSPOD 里面生成一对 API 的 Id 和 Key,记下来,然后在命令行将对应的内容 export 出来。一次使用后,acme.sh 会将这两个字符串记录下来,之后不需要反复输入了。
export DP_Id="1234567"
export DP_Key="dagdagdgasgsajdgsdgsag"
2
如果你用的其他家解析,对应的变量名请参照 https://github.com/acmesh-official/acme.sh/wiki/dnsapi (opens new window)。
# 切换签发机构到 Let's Encrypt
这是因为从 21 年 8 月起,默认的 CA 变成了 ZeroSSL,这个可以根据个人情况,有需要的话可以换回 Let's Encrypt。
acme.sh --set-default-ca --server letsencrypt
# 申请证书
按上面的步骤,完成对 DNS API key 的 export 之后,可以运行命令申请证书了。这里我申请一个通配符证书。
acme.sh --issue --dns dns_dp -d yourdomain.com -d *.yourdomain.com
如果一切顺利,几分钟后就可以完成整个脚本,提示你证书保存在 acme.sh 默认目录下了。
使用命令 acme.sh --list
可以查看当前拥有的证书。
我在使用时遇到一个报错的问题:
Error: CAA record for yourdomain.com prevents issuance
有可能是因为域名解析的设置导致的,我删掉了自己根域名的 CNAME 记录之后,再次申请就恢复正常了。
# 3)证书拷贝到 Nginx
这是额外的步骤,上一步之后证书就已经申请完成了。这里以 Nginx 为例,记录一下怎么将证书配置到服务器。
acme.sh --install-cert -d yourdomain.com \
--key-file /etc/nginx/cert/key.pem \
--fullchain-file /etc/nginx/cert/cert.pem \
--reloadcmd "service nginx force-reload"
2
3
4
上面替换成自己的域名。nginx 的目录也要根据自己的情况来替换,一般默认装在 /etc/nginx/ ,但是没有 cert 目录,自己可以建一个文件夹专门存放证书。
执行一次操作之后,这些目录也会被记录下来,acme.sh 从安装之后已经自动创建了一个定时任务,每天会执行脚本,检查有没有快过期的证书,并自动完成重新申请和重新拷贝部署。
# 4)配置 nginx 使用证书
这也是额外的步骤。在 nginx 的配置文件里相应修改,让 https 请求使用这些证书。例如,简单配置静态文件托管:
server {
listen 443;
server_name example.com;
ssl on;
ssl_certificate /etc/nginx/cert/cert.pem;
ssl_certificate_key /etc/nginx/cert/key.pem;
location / {
root /home/web/;
}
}
2
3
4
5
6
7
8
9
10
11
配置完成后重启 nginx,刷新网站,发现证书应用成功啦。
# 5) 配置 acme.sh 自动更新
因为 CA 的证书申请接口可能会更新,所以可以开启 acme.sh 的自动更新功能,及时获取 acme.sh 的最新版本。
acme.sh --upgrade --auto-upgrade