Certimate - 免费开源的 SSL 证书托管、自动续签工具,开发者维护 90 天免费证书的救星

很完美的 SSL 证书托管工具,安全可靠,简单易用。

Certimate 介绍

Certimate 是一个由国人开发的 SSL 证书管理工具,提供一个 web UI 界面让我们可以用简单直观的方式来管理 SSL 证书,申请证书、部署证书,以及证书到期续签都是自动完成的,不需要人工接入,大大简化了证书的维护工作。

Certimate 官网截图
Certimate 官网截图

工具特点

  • 私有部署:部署简单,作者提供多种方法安装,几分钟内就可以完成
  • 数据安全:所有数据都可以存储在本机,不会保存在第三方服务器上,数据的安全性有保障;
  • 维护证书方便:通过简单的配置就会自动申请并且部署证书,到期自动续签,无需人工干预。

我终于忍受不了 90 天的证书

作为开发者,相信大家一定和 SSL 证书打过交道,比如我这个网站的 https 安全访问,以及 css/js 、图片等静态文件托管等,都需要 SSL 证书。商业证书很昂贵,个人网站或中小企业一般都选择申请免费证书,之前的免费证书有效期都是1年,从今年上半年开始,免费证书颁发机构就把有效期改成了90天,这就导致了我们需要频繁去维护这些云服务的证书。

免费证书期限变为90天
免费证书期限变为90天

目前我手上维护的网站、服务器和 cdn 证书有十多个,为避免证书到期业务资源无法访问,不得不通过在 APP 设置备忘事项来提醒自己。

证书自动申请、部署和续签的原理

人工维护证书

证书的维护,人工操作其实就是这几个步骤:

  1. 填写域名等资料,向证书颁发机构申请证书
  2. 到域名商处添加解析记录,证明域名的归属权
  3. 等待证书颁发后,下载部署到网站服务器或是 cdn

证书到期后,因为免费证书不能自动续签,需要再次重复上面的步骤。其实申请证书不算复杂,但需要等解析生效,等待证书颁发,过程十分不流畅;而且对于这么多证书,很容易忘记哪天到期,导致线上服务不可用。

程序自动托管原理

自动管理证书的原理其实就是通过域名商和云服务厂商提供的开发密钥,调用 OpenAPI 来自动给域名添加解析完成证书的申请,得到证书后再次通过 OpenAPI 部署证书,或者通过 SSH 来把证书上传并部署到服务器上,完成证书的更新。

证书托管有哪些选择?

脚本工具

其实之前我就有了解过一些证书自动续签的命令行程序,这些工具运行在服务器端,不过我的服务器运维技术太菜,操作起来有困难,按之前使用 Linux 的经验,经常是执行一行安装命令后,终端界面会下载一大堆东西,最后也没能折腾成功。

企业提供的在线工具

还有一些公司的产品也提供证书托管功能,不过那是一个在线网页工具,需要用手机号注册。最重要的是我上面说过自动托管证书的原理,需要在上面填写阿里云/腾讯云的 AccessKey 密钥,如果部署到服务器,还需要填写服务器 SSH 远程登录密码/密钥等信息,这样高安全等级的信息一旦泄露,后果不堪设想。所以我都没敢使用。

证书救星 Certimate

今天介绍的 Certimate 是我刚刚发现的新工具,和其他类似工具相比,提供了 UI 界面来配置,操作非常地简单直观,更重要的是 Certimate 支持私有部署,完全可以部署在本地电脑或者自己的服务器上,开发密钥等信息不会泄露给第三方。

Certimate 文档
Certimate 文档

安装部署

我这个网站(那些免费的砖)的两个证书快要到期了,于是我昨天就部署了 Certimate,并且把证书托管在上面了。下面说一下部署的方法。

首先最容易部署的是在本地电脑上,只需要从项目 release 下载对应的包,解压后用命令行执行就可以了,不过部署在电脑上,自动续签功能需要电脑时常开机,之前我在《飞牛私有云,国产免费易用的个人私有云 NAS 系统》这篇文章里说过,我用闲置的 Mac mini 小主机搭建了一个小型 NAS,实际上也是一台 Linux 系统的服务器,全天在线,于是我就决定部署在上面。

Docker 方式部署

Certimate 提供了 Docker 方式部署,比较简单,NAS 里刚好自带 Docker。需要注意的是,Certimate 官网文档里提供的 docker 命令是从 Github 上 clone 项目,需要先解决 NAS 上账号问题才能顺利 clone,更简单的方式是在从 Certimate Github 上找到 docker/docker-compose.yml,把这个文件上传到 NAS 服务器上,然后通过 docker compose 安装:

$ docker-compose up -d  // 启动并在后台运行

这样就部署完成了,打开浏览器通过 ip+8090端口访问,就进入 web 管理界面了。

Certimate web UI 界面
Certimate web UI 界面

添加证书托管

接下来从 web 界面上添加域名,填写邮箱、云服务开发密钥等信息,就可以立即执行任务了。我的这个网站有两个证书,一个是网站主域名证书,域名验证阶段填写阿里云的开发密钥,部署阶段通过 SSH 方式;另一个是七牛云的 CDN 证书,域名验证还是阿里云,部署阶段填写七牛云的开发密钥。

怎么获取开发密钥网上有详细教程,就不展开说了,配置完了之后,在域名列表就看到这托管在任务已经完成,点击立即部署,会自动执行证书的申请。

证书申请失败问题

我点击立即部署后,进度停留在证书申请阶段,还是遇到了问题,查看日志,发现证书申请失败了,根据英文意思,原因是提交申请的来源无法识别是权威的服务器

我意识到我家的宽带和其他人的不一样,是没有分配公网 IP 的,连动态公网 IP 都没有,前面折腾 NAS 远程访问的时候,发现我家带宽的接入就是一个 NAT 大内网,运营商通过上游给我分配了一个内网 IP,所以我猜这应该就是多次申请失败的原因。

部署在服务器上

最终我还是部署到了公司的一台测试服务器上,好在部署简单,按照同样的操作步骤,已经成功托管了本网站的两个证书。Certimate 每天早上8点会执行一次,检查所有的证书是否到期,到期10天前会自动跑一遍证书流程,全程不需要人工干预了。

任务执行日志
任务执行日志

后续我会陆续把十几个证书全部托管在上面,终于解放了,不用再被这烦人的90天证书浪费精力了。

可以优化的地方

对于一些不支持自动部署的厂商,比如 uni-app 家的 uniCloud,需要自己上传证书。但 Certimate 的自动申请证书功能很方便,如果在部署阶段能去掉必填的限制,只提醒我们需要更新证书,就更好了。目前我只能设置一个假的 SSH 信息,执行到部署阶段时会报错,然后我再下载证书到本地。

免费开源说明

Certimate 是由来自国内的开发者 usual2970 开发的 SSL 证书管理工具,项目采用 MIT 开源协议,我们可以从 Github 上免费下载部署使用。