发布于 1 天前
发布于 1 天前
李慧敏
更新于 1 天前
0
0
certd(一个轻量级 ACME 证书管理工具,支持 Let's Encrypt)创建自动化证书申请与续期的流水线,并自动更新 雷池 WAF(SafeLine/Chaitin 社区版)证书的完整指南。整个流程基于 certd 的 daemon 模式 + post-hook 机制实现自动化(无需 CI/CD 平台,每日自动检查续期)。
1volumes:
2 - safeline_nginx_ssl:/opt/safeline/nginx/ssl # 雷池 Nginx SSL 目录
默认证书路径:/opt/safeline/nginx/ssl/{domain}.pem 和 {domain}-key.pem。1# 下载最新版(x86_64 Linux) 2curl -Lo certd https://github.com/longyun-cui/certd/releases/latest/download/certd-linux-amd64 3chmod +x certd 4sudo mv certd /usr/local/bin/ 5certd version # 验证
创建 /etc/certd/config.yaml:
1global:
2 email: "your-email@example.com" # Let's Encrypt 联系邮箱
3 directory: "https://acme-v02.api.letsencrypt.org/directory" # 生产环境
4 # directory: "https://acme-staging-v02.api.letsencrypt.org/directory" # 测试环境
5
6certificates:
7 - domain: "waf.example.com" # 替换为你的域名(支持多域名:domains: [waf.example.com, www.example.com])
8 provider: "nginx" # 或 "standalone"(需停止 Nginx)、"docker"
9 challenge: "http-01" # 或 "dns-01"(需配置 DNS API,如阿里云/Cloudflare)
10 # dns-01 示例(可选):
11 # dns:
12 # provider: "cloudflare"
13 # api_token: "your-cloudflare-api-token"
14 post-hook: |
15 # 更新雷池 WAF 证书
16 docker cp {{CertFile}} safeline-nginx:/opt/safeline/nginx/ssl/{{EnvName}}.pem
17 docker cp {{KeyFile}} safeline-nginx:/opt/safeline/nginx/ssl/{{EnvName}}-key.pem
18 docker exec safeline-nginx nginx -s reload
19 echo "证书已更新到雷池 WAF: {{Domain}}"
20 # pre-hook(可选,http-01 时停止 Nginx 验证):
21 # pre-hook: "docker stop safeline-nginx"
22 # post-hook: "docker start safeline-nginx"
{{CertFile}}、{{KeyFile}}、{{Domain}}、{{EnvName}} 是 certd 模板变量,自动替换。safeline-nginx 是雷池 Nginx 容器的名称(docker ps 查看)。1sudo certd run --config /etc/certd/config.yaml
/var/lib/certd/{domain}/(fullchain.pem 和 privkey.pem)。docker exec -it safeline-nginx ls /opt/safeline/nginx/ssl/,确认证书文件存在。https://waf.example.com,验证证书。certd 支持 daemon 模式,每日自动检查续期(Let's Encrypt 证书有效期 90 天)。
创建 systemd 服务 /etc/systemd/system/certd.service:
1[Unit]
2Description=certd ACME Certificate Manager
3After=network.target docker.service
4
5[Service]
6Type=simple
7ExecStart=/usr/local/bin/certd daemon --config /etc/certd/config.yaml
8Restart=always
9RestartSec=5
10
11[Install]
12WantedBy=multi-user.target
启用并启动:
1sudo systemctl daemon-reload 2sudo systemctl enable certd 3sudo systemctl start certd 4sudo systemctl status certd # 查看日志
日志查看:
1journalctl -u certd -f
/opt/safeline/nginx/conf.d/default.conf,容器内):
ssl_certificate /opt/safeline/nginx/ssl/waf.example.com.pem;
ssl_certificate_key /opt/safeline/nginx/ssl/waf.example.com-key.pem;
docker exec safeline-nginx nginx -t && docker exec safeline-nginx nginx -s reload。| 问题 | 解决方案 |
|---|---|
| 端口 80 被占 | 用 standalone provider + pre/post-hook 停止/启动 Nginx;或 DNS-01。 |
| Docker 卷权限 | chmod 644 /opt/safeline/nginx/ssl/*.pem(主机卷)。 |
| 续期失败 | 检查域名解析、防火墙(ufw allow 80/443);staging 测试。 |
| 多域名 | 在 domains: [] 添加,支持通配符 *.example.com(需 DNS-01)。 |
| 雷池容器名不对 | docker ps 确认,替换 safeline-nginx。 |
curl -X POST https://monitor.example.com/callback -d "cert renewed: {{Domain}}"。0 2 * * * /usr/local/bin/certd run --config /etc/certd/config.yaml。此流水线零维护,证书自动续期并无缝更新 WAF。测试通过后上线生产!如果有具体错误日志,提供更多细节我帮 debug。