开源的证书管理软件—certimate搭建和体验

certimate是一个开源的证书申请管理软件,提供简单的UI界面和流水线配置,支持多样的免费证书、20+的域名托管商、60+的部署目标、邮件、钉钉、飞书、企业微信、Webhook 等多种通知渠道,非常适合有多个证书管理需求,或者有一个域名证书要部署到多个目标的场景。

跟certimate相比,有一个相同的软件certd,这里简单的对比一下:

  • certd界面更美观,整体更专业
  • certd支持node,部署会更加通用
  • certd的文档比certimate要更详细
  • certimate的star数远多于certd,意味着certimate更受青睐
  • certimate用go语言,性能更好,占用内存更少
  • certimate完全免费,certd部分功能收费
  • certimate支持的证书更多、通知渠道更多

安装

certimate用golang语言写,所以支持最简单的二进制安装。请前往 GitHub Releases 下载对应操作系统的二进制文件。如果速度慢,可以尝试镜像加速:akams

./certimate serve
## 后台运行
nohup ./certimate serve > /dev/null 2>&1 &

也可以使用docker安装。如果需要挂载硬盘,你应该挂载容器中的/app/pb_data目录。

# 拉取镜像
docker pull registry.cn-shanghai.aliyuncs.com/usual2970/certimate:latest
# 启动容器
docker run -d \
--name certimate_server \
--restart unless-stopped \
-p 8090:8090 \
usual2970/certimate:latest

然后你可以访问本地端口8090,http://127.0.0.1:8090,默认账号密码:

登录之后修改账号密码,点击右上角齿轮状图标,在“登录账号”和“登录密码”两处tab页分别修改账号和密码,这个UI略简陋。

使用

创建工作流,选择“标准模板”,工作流取名可以是“xxx域名证书申请”用来区分工作流。默认的工作流长得下面这样:

开始

一共就两个选择,就选择如何触发工作流,可选“自动触发”和“手动触发”,自动触发就是像闹钟一样定时触发以运行工作流,只是这里不像调闹钟一样直白,用的是cron表达式,参考这个在线cron表达式网站可以让定时更加直观:https://cron.ciding.cc/。手动触发就是需要用鼠标手动点击按钮,这不是我们想要的。

申请证书

配置如何申请免费证书。只要把下面几个填写完成就好了。

1.域名

这里建议填写泛域名。即*.domain.com,那么这个证书适用于domain.com的所有二级子域名,但不包括domain.com自身,也不包括三级、四级…子域名。当然这里也可以填写多个域名,完全不相同的域名也是可以的,因为一个证书是可以同时签发多个不相同的域名,如domain1.com、domain2.com…,但我觉得除非有特殊情况必须这样,否则即使想办法也要避免这样的证书,真的太乱了不好管理。

2.联系邮箱

填写一个常用的邮箱,没什么用。即使填写一个不存在的域名也没关系。据我所知,这个邮箱会影响Let’s Encrypt的证书申请,因为它会根据邮箱限制证书申请的数量和速率。

3.DNS 提供商授权

你的域名放在哪个DNS服务商解析的。默认支持多个常见的DNS服务商,选择服务商后添加对应服务商的API密钥,一般有两个:AccessKeyId和AccessKeySecret,具体还要看各家提供商的情况填写,获取到之后还要给DNS权限,否则光有密钥没有权限也是不行的。DNS提供商授权的目的:申请证书时RA机构需要验证域名所有权,验证所有权的其中一个方法是向域名添加一条TXT或者CNAME的解析记录,记录值随机给定。因此certimate需要有修改DNS的权限添加这个解析记录,验证权限成功后再删除解析记录。

4.证书颁发机构

默认选择的是Let’s Encrypt,也就是什么都不需要配置,这也是最通用和最容易或者到的免费证书。如果需要Google提供的免费证书,毕竟有大厂加持,那么需要如下操作:

  • 打开链接启用API:https://console.cloud.google.com/apis/library/publicca.googleapis.com
  • 留在上面的页面,点击右上角激活CloudShell图标,然后等待谷歌云分配资源打开Shell窗口
  • Shell窗口内执行gcloud beta publicca external-account-keys create
  • 此时会弹出“为 Cloud Shell 提供授权”,点击授权即可
  • 返回如下结果,记录这两个值:b64MacKey和keyId,用这两个值填写在Google Trust Services的授权中
    Created an external account key
    [b64MacKey: xxxxxxxxxxxxxxxx
    keyId: xxxxxxxxxxxxx]

部署证书

证书申请成功后将证书放到哪里?默认提供了大量的目标,比如SSH、阿里云OSS、阿里云DNS、腾讯云COS、腾讯云DNS,还有其他厂家一大堆。如果我要把证书部署在一台普通主机呢,怎么办?那就直接用SSH把证书传上去。这就不多说了。

这里我遇到的一个问题是要把证书部署到阿里云函数,但总是报错:CertConfig is not required when protocol is HTTP request id: <nil> Data,我第一反应是如果调用阿里云api的http地址,阿里云觉得http没有加密不安全就拒绝了部署证书,也就是不让携带参数CertConfig,那么我自然想到到的是certimate会不会调的是老的阿里云SDK包,导致用的api地址是http的。我在想那么我自己写一个hook吧,把证书部署到阿里云函数的动作部署到cloudFlare workers上,也不用费精力找服务器,也不用费额外成本。写着写着发现阿里云提供的api最新接口就是2023-03-30的,certimate调的不是老接口!好吧,去看一下certimate的代码,发现它在UpdateCustomDomain之前先去GetCustomDomain,本意应该是确保这个自定义域名存在,否则证书白费放上去。但是问题就出在他把GetCustomDomain返回结果的protocol字段给拿出来传给了UpdateCustomDomain。结果是滑稽的:我没有证书所以要用api上传证书,但是云函数因为没有证书返回配置的是http,certimate拿http做参数去上传证书当然会被拒绝,因为http不需要配置证书。解决方法就是:先手动给云函数上传证书开启https,然后再用certimate部署阿里云函数,部署成功,问题解决。

推送通知

支持多种推送,比如微信、钉钉、飞书、邮箱、短信、企业微信,我觉得除了邮箱推送外,最实用的就是“Server 酱”推送,我们手机上一般不会去专门装一个邮箱软件去收邮箱,但是我们一般都会备一个微信,“Server 酱”支持直接把通知推送到你的微信,而且是免费。只是免费版每条只有5条消息推送。

结论

certimate作为一个开源的ssl证书管理软件,提供多个dns服务商、多种类型的免费证书和多种目标推送的集成,并提供工作流使一切都可视化操作,真的很赞。