使用 Certbot + Docker + Cloudflare 实现 DNS-01 验证和证书自动续期

前言

以下介绍如何使用 Let’s Encrypt 的免费 SSL 证书,并通过 DNS-01 验证方式实现证书申请与自动续期,DNS 提供商为 Cloudflare。


一、准备工作

1. Cloudflare API Token 设置

  1. 登录 Cloudflare → API Tokens 页面
  2. 创建一个 Edit zone DNS 的 Token,权限如下:
    • Permissions:
      • Zone > DNS > Edit
    • Zone Resources:
      • Include → Specific zone → 填写你要申请证书的域名
  3. 设置 Token 作用域为你要使用的域名(例如 example.com
  4. 保存此 Token 到一个安全的位置

2. 创建 Cloudflare 凭证文件

在你的项目目录下创建 .cloudflare/cloudflare.ini 文件,内容如下:

1
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN

⚠️ 注意权限设置:

1
chmod 600 .cloudflare/cloudflare.ini

二、Docker Compose 配置

1. 目录结构示意

1
2
3
4
5
6
7
8
certbot-cloudflare/
├── docker-compose.yml

data/
├── certbot/
├── cloudflare/
└── cloudflare.ini
├── conf/

2. docker-compose.yml 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3'

services:
certbot-cloudflare:
image: certbot/dns-cloudflare
container_name: certbot-cloudflare
volumes:
- ../data/certbot/conf:/etc/letsencrypt
- ../data/certbot/cloudflare:/cloudflare
networks:
- nginx-net
command: >
certonly
--dns-cloudflare
--dns-cloudflare-credentials /cloudflare/cloudflare.ini
--dns-cloudflare-propagation-seconds 90
--agree-tos
--no-eff-email
--email [email protected]
-d blog.example.com
-d work.example.com

三、申请证书(首次)

执行以下命令:

1
docker-compose run --rm certbot-cloudflare

说明:

  • --dns-cloudflare-propagation-seconds 90:等待 DNS 生效时间,Cloudflare 通常 30 秒即可,但为稳定建议 60~120 秒
  • -d 后跟你的域名,可以多个

申请成功后证书路径为:

1
2
/etc/letsencrypt/live/blog.example.com/fullchain.pem
/etc/letsencrypt/live/blog.example.com/privkey.pem

四、自动续期配置

证书有效期为 90 天,需自动更新。

使用以下命令测试续期(不会真的更新):

1
2
3
4
5
6
docker-compose run --rm certbot-cloudflare renew --dry-run
# 或
docker-compose run --rm certbot-cloudflare renew --dry-run \
--dns-cloudflare \
--dns-cloudflare-credentials /cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 90

若输出类似如下表示续期失败:

1
Detail: During secondary validation: Secondary validation RPC failed

解决方案:

  • 确保域名的 DNS 由 Cloudflare 托管
  • 确保 .ini 权限为 600
  • 增大等待时间:例如 --dns-cloudflare-propagation-seconds 120

五、定时任务自动续期

编辑 crontab

1
crontab -e

添加如下内容:

1
0 3 * * * cd /opt/myapps/certbot-cloudflare && docker-compose run --rm certbot-cloudflare renew --dns-cloudflare --dns-cloudflare-credentials /cloudflare.ini --dns-cloudflare-propagation-seconds 120 >> /var/log/ssl_renew.log 2>&1

建议设置每日凌晨执行,可配合脚本实现自动 reload nginx:

1
--deploy-hook "nginx -s reload"

六、排错建议

  • 查看 Certbot 日志:
1
cat /var/log/letsencrypt/letsencrypt.log
  • 使用 --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/
作者
月下独白
发布于
2025年7月22日
许可协议