
certbot/dns-cloudflare镜像名称:certbot/dns-cloudflare(基于Certbot官方镜像构建)
官方维护:Electronic Frontier Foundation (EFF)
核心用途:该镜像为Certbot的官方Docker镜像,集成了Cloudflare DNS插件,用于通过DNS-01挑战(DNS-01 challenge)自动获取、续期SSL/TLS证书。适用于使用Cloudflare DNS服务的域名,无需暴露服务器80/443端口即可完成域名验证。
*.example.com等通配符域名申请证书(ACME协议要求通配符证书必须通过DNS-01验证)。a.example.com、b.example.com)申请证书。Zone:Read(读取域名区域信息)DNS:Edit(修改DNS记录,用于添加/删除TXT记录)| 环境变量名 | 说明 | 是否必填 |
|---|---|---|
CF_DNS_API_TOKEN | Cloudflare API令牌(推荐),需包含DNS:Edit和Zone:Read权限 | 是 |
CF_ZONE_API_TOKEN | (可选)仅用于指定区域的令牌,优先级高于CF_DNS_API_TOKEN | 否 |
CF_API_EMAIL | Cloudflare账户***(传统API密钥模式使用,与CF_API_KEY配合) | 否 |
CF_API_KEY | Cloudflare全局API密钥(传统模式,不推荐,优先使用API令牌) | 否 |
CERTBOT_EMAIL | 用于接收证书过期通知的***地址 | 是 |
| 参数 | 说明 |
|---|---|
certonly | 仅申请证书(不自动安装到服务器) |
--dns-cloudflare | 指定使用Cloudflare DNS插件 |
--dns-cloudflare-credentials | (可选)指定包含Cloudflare凭据的配置文件路径(替代环境变量) |
--non-interactive | 非交互式模式(适合自动化脚本) |
--agree-tos | 同意ACME服务条款 |
--email | 指定管理员***(同CERTBOT_EMAIL环境变量,命令行参数优先级更高) |
-d | 指定目标域名(支持多个,如-d example.com -d *.example.com) |
docker run获取证书首次申请证书(通配符域名示例)
bashdocker run --rm \ -v /etc/letsencrypt:/etc/letsencrypt \ # 挂载证书存储目录(持久化证书) -v /var/lib/letsencrypt:/var/lib/letsencrypt \ # 挂载Certbot工作目录 -e "CF_DNS_API_TOKEN=your_cloudflare_api_token" \ # Cloudflare API令牌 -e "CERTBOT_EMAIL=***" \ # 管理员*** certbot/dns-cloudflare \ certonly \ --dns-cloudflare \ --non-interactive \ --agree-tos \ -d example.com \ -d *.example.com
证书续期(自动续期)
Certbot默认会检查证书有效期(剩余30天内自动续期),可通过以下命令手动触发续期:
bashdocker run --rm \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /var/lib/letsencrypt:/var/lib/letsencrypt \ -e "CF_DNS_API_TOKEN=your_cloudflare_api_token" \ certbot/dns-cloudflare \ renew \ --non-interactive
创建docker-compose.yml文件:
yamlversion: '3.8' services: certbot: image: certbot/dns-cloudflare volumes: - ./letsencrypt:/etc/letsencrypt # 本地目录挂载,持久化证书 - ./letsencrypt-lib:/var/lib/letsencrypt # 工作目录 environment: - CF_DNS_API_TOKEN=your_cloudflare_api_token # 替换为实际API令牌 - CERTBOT_EMAIL=*** # 替换为实际*** command: > certonly --dns-cloudflare --non-interactive --agree-tos -d example.com -d *.example.com
启动容器申请证书:
bashdocker-compose up
容器内证书默认存储于/etc/letsencrypt,通过卷挂载到宿主机后,可在宿主机路径(如/etc/letsencrypt)中查看:
/etc/letsencrypt/live/example.com/fullchain.pem/etc/letsencrypt/live/example.com/privkey.pemCertbot证书默认有效期为90天,建议通过定时任务(如crontab)自动续期:
/opt/certbot/renew.sh:bash#!/bin/bash docker run --rm \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /var/lib/letsencrypt:/var/lib/letsencrypt \ -e "CF_DNS_API_TOKEN=your_cloudflare_api_token" \ certbot/dns-cloudflare renew --non-interactive
bashchmod +x /opt/certbot/renew.sh
bashecho "0 3 * * * /opt/certbot/renew.sh >> /var/log/certbot-renew.log 2>&1" | crontab -
Zone:Read和DNS:Edit权限,避免因权限不足导致验证失败。/etc/letsencrypt目录需持久化存储(通过Docker卷挂载),防止容器删除后证书丢失。docker logs <容器ID>查看证书申请/续期过程中的详细日志,用于排查错误。manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务