certd 使用操作指南 - SSL 证书自动管理

什么是 certd?

certd 是一款开源、免费、全自动的 SSL 证书管理工具。它能做到:

  • 自动申请证书(支持 Let’s Encrypt / Google / ZeroSSL)
  • 自动续期(证书 90 天有效期,certd 自动提前续)
  • 自动部署(支持 nginx、云厂商、腾讯云、宝塔、群晖等 100+ 部署目标)
  • 支持通配符证书(一个证书管多个子域名)
  • 支持多数据库(SQLite / MySQL / PostgreSQL)
  • 私有化部署,数据加密存储

核心价值:装上 certd 之后,你再也不会收到”证书过期”的告警邮件。

我的部署实例

我把 certd 部署在云厂商 ECS(your.server.ip)上,管理着 yourdomain.com 的 4 个子域名证书。

项目
部署位置 /usr/local/apps/certd
Web UI https://certd.yourdomain.com
端口 7001(HTTP)/ 7002(HTTPS)
数据库 SQLite
systemd certd.service(开机自启)
内存占用 ~160MB

安装步骤(从零开始)

1. 服务器准备

1
2
3
4
5
# 安装基础工具
dnf install -y git unzip
# Node.js 22+(如已装可跳)
# pnpm 10+
npm install -g pnpm@10

2. 克隆 certd 源码

1
2
3
cd /usr/local/apps
git clone --depth=1 https://gitee.com/certd/certd.git
cd certd

3. 修改工作区配置(只编译 server)

1
2
3
4
cat > pnpm-workspace.yaml << 'EOF'
packages:
- 'packages/ui/certd-server'
EOF

4. 安装依赖 + 构建

1
2
3
pnpm install --registry https://registry.npmmirror.com
cd packages/ui/certd-server
NODE_OPTIONS="--max-old-space-size=600" pnpm run build

5. 下载前端 UI

1
2
3
4
5
6
# 自动获取版本号
version=$(node --experimental-json-modules /usr/local/apps/certd/scripts/version.js)
front_zip="ui-$version.zip"
cd /usr/local/apps/certd/packages/ui/certd-server
curl -L -o $front_zip "https://atomgit.com/certd/certd/releases/download/v$version/ui-$version.zip"
unzip -o -q $front_zip -d ./public

6. 启动(先用 nohup 测试)

1
2
nohup env NODE_OPTIONS="--max-old-space-size=600" NODE_ENV=production \
pnpm run start > /var/log/certd.log 2>&1 &

访问 http://your_server_ip:7001,看到登录页就成功了。

7. 写 systemd unit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# /etc/systemd/system/certd.service
[Unit]
Description=Certd - SSL Certificate Management
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/apps/certd/packages/ui/certd-server
Environment=NODE_ENV=production
Environment=NODE_OPTIONS=--max-old-space-size=600
Environment=PATH=/usr/local/bin:/usr/bin:/bin
ExecStart=/usr/local/bin/pnpm run start
Restart=on-failure
RestartSec=5
StandardOutput=append:/var/log/certd.log
StandardError=append:/var/log/certd.log

[Install]
WantedBy=multi-user.target
1
2
3
systemctl daemon-reload
systemctl enable --now certd
systemctl status certd

8. 用 nginx 反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# /etc/nginx/conf.d/certd.conf
server {
listen 443 ssl;
server_name certd.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

client_max_body_size 50m;

location / {
proxy_pass http://127.0.0.1:7001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 600s;
}
}

server {
listen 80;
server_name certd.yourdomain.com;
return 301 https://$host$request_uri;
}

首次登录配置

1. 改默认密码

  1. 浏览器打开 https://certd.yourdomain.com
  2. 用默认账号登录:admin / 123456
  3. 立即改密码(强烈建议),长度 12+ 字符,包含大小写+数字+符号
  4. 启用 2FA(设置 → 两步验证):用 Authenticator 类 APP 扫码

2. 配置通知(可选但推荐)

设置 → 通知渠道 → 添加:

  • 邮件:填 SMTP 服务器、发件人、收件人
  • Webhook:钉钉/飞书/企微机器人 URL
  • anpush:推送服务

证书即将过期、续签成功、续签失败都会通过这些渠道通知你。

创建第一条流水线(核心)

1. 添加授权(以云厂商 DNS 为例)

授权管理 → 添加授权:

  • 类型:云厂商 DNS
  • 名称:cloud-dns-prod
  • AccessKey ID:(在云厂商控制台 RAM 访问控制创建)
  • AccessKey Secret:(同上,只给 DNS 权限)

2. 创建证书流水线

流水线管理 → 新建:

  • 名称:yourdomain-certs
  • 域名:
    • yourdomain.com
    • www.yourdomain.com
    • claw.yourdomain.com
    • certd.yourdomain.com
  • DNS 授权:选刚才的 cloud-dns-prod
  • 验证方式:DNS-01(推荐,能签通配符)
  • 证书商:Let’s Encrypt
  • 部署任务:
    • 类型:主机部署
    • 主机:localhost
    • 路径:/etc/nginx/certd/
    • 部署后命令:nginx -s reload
  • 触发时机:
    • 启用定时:✅
    • Cron:0 3 */7 * *(每 7 天凌晨 3 点跑一次)

3. 测试运行

流水线详情 → 立即运行。观察日志:

  • 申请 → 验证 → 下载 → 部署 → 重启 nginx
  • 5 步都成功就完事了

流水线任务类型速查

任务类型 用途
申请证书 从 Let’s Encrypt 申请
DNS 验证 DNS-01 / HTTP-01 两种
部署到主机 通过 SSH 推送到其他服务器
部署到云厂商 CDN 自动同步到云厂商 CDN
部署到 nginx 写证书文件 + reload
通知 邮件/钉钉/webhook

常见问题

Q: certd 和 certbot 能共存吗?

A: 能。certd 默认不会碰 /etc/letsencrypt/,它写到自己的目录。两者互不干扰。

Q: 第一次跑流水线,DNS 验证要等多久?

A: DNS-01 一般 1-5 分钟,HTTP-01 一般几秒。

Q: 证书快要过期了 certd 会提醒吗?

A: 会的。如果你配了通知渠道,证书到期前 30/7/1 天会发提醒。

Q: 删了 certd,证书怎么办?

A: 不会自动失效,但 certd 不会续签,证书到期后网站会爆掉。建议删除前先在 certd 里把流水线停掉,回到 certbot 或手动续签。

Q: 一个流水线能管多个域名吗?

A: 能。添加多个域名(支持通配符),一次性申请一个多 SAN 的证书。

监控与运维

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 看 certd 状态
systemctl status certd

# 看实时日志
journalctl -u certd -f
# 或
tail -f /var/log/certd.log

# 看数据库大小
ls -lh /usr/local/apps/certd/packages/ui/certd-server/data/db.sqlite

# 备份数据库(cron 每天备份)
cp /usr/local/apps/certd/packages/ui/certd-server/data/db.sqlite \
/backup/certd-$(date +%Y%m%d).sqlite

我的实际流水线

最终我在 certd 里建了 2 条流水线:

  1. yourdomain-certs:管 yourdomain.com + 3 个子域名的 4 域名证书
  2. yourdomain-wildcard:管 *.yourdomain.com 通配符证书(备用)

每条流水线配 cron 每 7 天跑一次,证书在到期前 30 天自动续签,我已经半年没手动碰过证书了

总结

certd 是个人/小团队服务器装一次、忘一辈子的工具。配置 30 分钟,省下未来 N 年的证书运维时间。

如果你也用 certd,欢迎留言交流 👋