SSL 证书续期不用再手动:Certimate 自托管 ACME 工作流部署
证书到期这件事,麻烦不在申请本身,在于之后的每一次重复:
- 到期前得有人记得,忘了就是线上 502;
- DNS-01 质询要手动去 DNS 面板加 TXT 记录,签完再删;
- 证书签出来还得分发到 Kubernetes Ingress、CDN、WAF、负载均衡,漏一处就有节点拿着旧证书跑。
Certimate 把申请、部署、续期、监控串成一条可视化工作流,跑在自己的机器上,不依赖第三方托管。
项目信息
- 仓库:
- 文档:
- Docker Hub:
certimate/certimate - Go 编写,MIT 许可,GitHub 上约 9.3k star
能力范围
- 自托管,数据存本地,不往第三方传;
- 跨平台,Windows / Linux / macOS 都能跑;
- 零依赖,不用装数据库、运行时或框架;
- 内存占用约 20MB;
- 证书类型覆盖单域名、多域名、泛域名,也支持 IP 地址证书;密钥可选 RSA 或 ECC;
- 同时支持 DNS-01 和 HTTP-01 质询;
- 输出格式支持 PEM、PFX、JKS 等;
- 70+ 域名注册商 / DNS 服务商(AWS、Cloudflare、GoDaddy、阿里云、腾讯云等);
- 160+ 部署目标(Kubernetes、CDN、WAF、负载均衡等);
- 通知渠道有邮件、Discord、Slack、Telegram、钉钉、飞书、企业微信等;
- ACME CA 可选 Let's Encrypt、Actalis、Google Trust Services、SSL.com、ZeroSSL 等。
跑起来
二进制方式:从 GitHub Releases 下载对应平台的预编译包,解压后执行:
./certimate serve
Docker 方式:
docker run -d \
--name certimate \
--restart unless-stopped \
-p 8090:8090 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v $(pwd)/data:/app/pb_data \
certimate/certimate:latest
然后浏览器访问 http://127.0.0.1:8090。
两个挂载需要留意:/etc/localtime 和 /etc/timezone 只读挂进容器,是为了让容器时区和宿主机一致,续期任务的时间调度才不会错位;$(pwd)/data 对应容器内 /app/pb_data,配置、账号、证书数据都落在这里,备份就是拷这个目录。
默认账号必须先改
首次登录的默认管理员账号是:
用户名:admin@certimate.fun
密码:1234567890
这是公开写在文档里的弱口令。实例一上线就要改掉,如果端口暴露在公网而没改,等于把 DNS API 凭据和证书私钥直接交出去。同理,这个服务通常只在内网或反代后面访问,不要直接 0.0.0.0:8090 对着公网开。
适合和不适合
适合的场景:手上有一批域名,证书分散在多个入口,续期靠人记;或者不希望把 DNS 凭据交给第三方 SaaS,需要私钥和配置全部留在自己机器上。
不太适合的场景:完全不想维护任何服务,只想签个证书挂到单台 Nginx 上,ACME 客户端加个 cron 更省事;DNS 服务商和部署目标如果不在支持列表里,DNS-01 这条链路要先用文档确认能不能走通,否则自动化会卡在质询那一步。
文档
完整配置、工作流编排和升级说明都在 。几篇值得先看的:《Migrate to v0.4》(升级前过一遍)、《使用 CNAME 完成 ACME DNS-01 质询》、《Why Certimate?》。