基于certimate自动化更新免费SSL证书

业务背景

由于国内各大云服务商在 2024 年把免费的 SSL 证书时长从一年变更为3 个月[1](应该是源头提供免费 SSL 证书的服务商决定的),所以手动更换域名的 SSL 证书就变得繁琐起来了,尤其是手上有多个域名进行维护的时候,因为免费 SSL 证书都是单域名的。

关于 certimate

基于上面的缘由和业务需求,因此也就出现了一些自动续签免费 SSL 证书的服务器脚本,而 certimate 这个工具则是把这个业务做成了客户端配置的形式,因此可以很方便地进行使用。

至于 certimate 的安装和操作,建议查看 其官方文档,这里就不赘述了。而它的用法也很简单:

  1. 配置域名
  2. 配置域名对应的 DNS 授权
  3. 配置证书部署相关的授权和部署操作

等配置完成后,就可以丝滑地按下按钮一键申请免费 SSL 证书并部署到指定地方,完成域名的 SSL 证书更新。

版本更新

由于该软件目前没有提供自动更新的功能,因此更新软件版本需要自己手动到 github 下载对应版本的二进制包,然后替换即可。

image.png

兼容性

由于该软件在 0.2.0 版本开始不兼容以前的版本 [2],即 0.2.0 以前的版本无法直接更新到 0.2.0 及以后版本,如果非要升级则需要手动重新配置一遍之前所有的设置。

不过按照我的使用经验,我个人觉得 0.1.x 版本的功能就已经完全够用了,如果不是遇到什么恶性 bug,不是很建议升级。

实操

就我个人的情况而言,手上有一个阿里云的域名及其下面若干个子域名,而这些域名则是用于腾讯云主机上部署的网站和七牛云对象存储的CDN。因此我的需求就两种:

  • 把阿里云的域名证书部署到腾讯云主机上
  • 把阿里云的域名证书部署到七牛云上

阿里云的 DNS 授权

由于申请域名证书需要域名服务商的 DNS 授权,因此首先需要到阿里云拿到可以修改 DNS 记录权限的 AK 和 SK。当然,阿里云账号总的 AK 和 SK(即完全权限)也可以用于修改 DNS:

image.png

不过并不建议直接使用具有完全权限的 AK 去进行 DNS 授权,因为这个权限太高了,风险很高,所以建议创建一个 RAM 用户,而该用户恰好只包含操作 DNS 的最小范围的权限,如:

image.png

操作 DNS 需要的权限如下:

image.png

而一个快速找到匹配权限的技巧就是在新增授权表单中输入关键词即可,如输入”DNS“:

image.png

这样就得到了一个只能操作 DNS 的阿里云 RAM 用户,然后把该用户的 AK 和 SK 填入配置即可:

image.png

证书部署到腾讯云主机上

既然是云主机,那么就可以通过 SSH 协议进行登录部署,这里可以按照自己的喜好选择证书登录,或者是直接使用用户名和密码的形式进行登录:

image.png

而这里的服务器 Host 需要填服务器的公网 IP 地址,上面的是服务器登录相关的配置,剩下的则是证书部署目录相关的配置:

image.png

证书部署到七牛云 CDN 上

七牛云提供了 AK 和 SK 相关的密钥,使用密钥则可以进行证书的部署。不过七牛云并没有像阿里云那样的 RAM 用户,所以只能使用用户级别的密钥:

image.png

image.png

不过由于 certimate 并没有提供将证书与具体存储空间的 CDN 域名绑定的操作,因此实际上只能把证书上传到七牛云的 SSL 证书目录中,而无法自动替换更新到具体的存储空间(所以会触发部署失败的提示,但实际上证书上传成功了):

image.png

image.png

不过好在只需要到对应存储空间里的域名管理手动更新证书即可:

image.png

image.png

一些问题

在我使用 0.1.11 版本的 certimate 时,我发现在证书即将过期的时候并没有触发自动更新证书的功能:

image.png

所以就导致整套逻辑会退化到“半自动化”的一种状态,当然,也可以在证书即将过期的时候使用强行部署功能,这时候就会强制重新申请新的证书并进行替换:

image.png

不过我看到有人在 GitHub 中提了相关 issue,作者表示使用最新的稳定版本可以解决这个问题 [3],这个有待进一步的观察……


  1. 现在还有没有一年的免费ssl证书? - 电脑讨论(新) - Chiphell - 分享与交流用户体验 ↩︎

  2. V0.2.0-第一个不向后兼容的版本 | Certimate ↩︎

  3. [Bug] 自动续期证书服务未工作 · Issue #383 · usual2970/certimate ↩︎