使用 Certbot + Docker + Cloudflare 实现 DNS-01 验证和证书自动续期
前言
以下介绍如何使用 Let’s Encrypt 的免费 SSL 证书,并通过 DNS-01 验证方式实现证书申请与自动续期,DNS 提供商为 Cloudflare。
一、准备工作
1. Cloudflare API Token 设置
- 登录 Cloudflare → API Tokens 页面
- 创建一个
Edit zone DNS的 Token,权限如下:- Permissions:
Zone > DNS > Edit
- Zone Resources:
- Include → Specific zone → 填写你要申请证书的域名
- Permissions:
- 设置 Token 作用域为你要使用的域名(例如
example.com) - 保存此 Token 到一个安全的位置
2. 创建 Cloudflare 凭证文件
在你的项目目录下创建 .cloudflare/cloudflare.ini 文件,内容如下:
1 | |
⚠️ 注意权限设置:
1 | |
二、Docker Compose 配置
1. 目录结构示意
1 | |
2. docker-compose.yml 示例
1 | |
三、申请证书(首次)
执行以下命令:
1 | |
说明:
--dns-cloudflare-propagation-seconds 90:等待 DNS 生效时间,Cloudflare 通常 30 秒即可,但为稳定建议 60~120 秒-d后跟你的域名,可以多个
申请成功后证书路径为:
1 | |
四、自动续期配置
证书有效期为 90 天,需自动更新。
使用以下命令测试续期(不会真的更新):
1 | |
若输出类似如下表示续期失败:
1 | |
解决方案:
- 确保域名的 DNS 由 Cloudflare 托管
- 确保
.ini权限为 600 - 增大等待时间:例如
--dns-cloudflare-propagation-seconds 120
五、定时任务自动续期
编辑 crontab:
1 | |
添加如下内容:
1 | |
建议设置每日凌晨执行,可配合脚本实现自动 reload nginx:
1 | |
六、排错建议
- 查看 Certbot 日志:
1 | |
- 使用
--dry-run -v查看详细信息
七、总结
使用 Certbot + Docker + Cloudflare 的 DNS-01 方式可以让我们自动管理多个域名的 HTTPS 证书,不需要暴露 80 或 443 端口,适用于内网、反向代理等场景,关键是设置好 API 权限和等待时间参数。
使用 Certbot + Docker + Cloudflare 实现 DNS-01 验证和证书自动续期
http://eevann.cn/2025/07/21/certbot-cloudflare-https/