前言

iOS应用要求使用HTTPS,后台网页以及官网需要设置HTTPS避免劫持,微信支付回调需要HTTPS链接,同时还要提供运营后台网页给不同城市的人员使用,不断追加子域名,导致生产环境需要维护的域名证书数量已经接近30个……大量的证书需求就是这么来的,使用付费证书的话也会是一笔大开销。

最初使用Let’s Encrypt证书时只支持单域名,有效期90天,优点是可以批量处理,每隔一段时间更新证书后,重载Nginx或者服务,之后出现了赛门铁克的免费单域名证书,有效期一年,在阿里云和腾讯云上都可以申请使用,阿里云的限制为每个账户最多20个,腾讯云的限制为每个域名最多20个,可以通过HTTP或者DNS来验证签发,操作步骤较多,还需要开通多个账号来应对证书到期时的大批量更换问题。

生产环境里的证书在下个月就要过期,但今年三月份Let’s Encrypt正式支持了通配符证书,而赛门铁克的单域名证书可以继续用在一些需要自定义域名的第三方服务,全面切换到通配符证书后只需要维护三个,工作量已经减少很多了。

正文

证书工具:acme.sh

纯shell实现,对比certbot工具不需要安装额外的Python依赖。

部署方式:首先运行acme.sh申请证书,获取TXT记录,然后将TXT记录添加到DNS解析,最后运行acme.sh验证记录并签发证书。由于要部署在生产环境中,全部使用手动操作。

首先安装acme.sh。

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

默认安装在~/.acme.sh目录下,安装后在自动在shell配置文件中追加配置,需要source一次配置文件后使用。

以本站为例,申请证书,获取TXT记录(注:需要添加两个域名来覆盖主域名和全部子域名,获得两个TXT记录)。

1
acme.sh --issue -d "wbuntu.com" -d "*.wbuntu.com" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

运行后在终端可以获取到子域名和对应的TXT记录,并在域名服务提供商那里添加解析。

然后执行更新命令,获取证书。

1
acme.sh --renew -d "wbuntu.com" -d "*.wbuntu.com" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

证书默认保存在~/.acme.sh/域名目录下,我们需要fullchain.cer域名.key文件用于配置Nginx。

最后删除掉添加的TXT记录,在VPS上运行crontab -e命令,删除自动检查与更新证书的任务,下次更新证书时,也需要重复上述操作。