文章内容
2026/1/6 18:21:21,作 者: 黄兵
Caddy 通配符证书相关问题
如果是通配符证书,Caddy 将无法申请,Caddy 在获取通配符证书时的 ACME challenge 失败,会产生错误。具体错误内容:
no solvers available for remaining challenges (configured=[http-01 tls-alpn-01] offered=[dns-01] remaining=[dns-01])
1️⃣ 原因分析
-
你配置的域名是通配符:
*.eu-ac.occ.example.com -
Let's Encrypt 对通配符证书 只支持
DNS-01验证 -
当前 Caddy 默认只配置了
http-01和tls-alpn-01 -
所以无法通过 HTTP/HTTPS 验证得到通配符证书 → 获取失败
这不是网络错误,而是 ACME 验证方式不匹配
我们修改上篇文章中的 Caddyfile 文件:
{
email [email protected]
# 【修正点】必须在这里使用 {env.变量名} 将 token 传给插件
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
*.eu-ac.occ.example.com {
encode {
zstd
br
gzip
}
reverse_proxy nginx_backend:8081 {
header_up Host {host}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Proto {scheme}
header_up X-Original-URI {uri}
}
}
st.exmaple.com {
encode zstd br gzip
reverse_proxy nginx_backend:8081 {
header_up Host {host}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Proto {scheme}
header_up X-Original-URI {uri}
}
}同时我们修改 Dockerfile 文件,使用 xcaddy 构建自定义 Caddy,并加入 Cloudflare 插件:
# 阶段 1: 构建 Caddy
FROM caddy:builder AS builder
# 构建 Caddy 并添加 Brotli + Zstd + Cloudflare DNS
RUN xcaddy build \
--with github.com/ueffel/caddy-brotli \
--with github.com/caddy-dns/cloudflare \
--output /usr/bin/caddy
# 阶段 2: 生成最终镜像
FROM caddy:alpine
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
设置环境变量
-
Cloudflare 需要 API Token,我们修改
docker-compose.yml文件environment部分。Docker Compose 会自动读取.env文件中的变量,只需要在 yaml 中引用它:
services:
caddy:
build: . # 指向包含 Dockerfile 的 Caddy 构建目录
image: caddy-custom # 给你的自定义镜像起个名字,防止和官方镜像混淆
container_name: caddy_custom
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3 需要 UDP
environment:
# ${CLOUDFLARE_API_TOKEN} 会被替换为 .env 文件里的值
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- nginx_backend # 等 Nginx 启动后再启动 Caddy
nginx_backend:
image: nginx:mainline
container_name: nginx_backend
restart: unless-stopped
volumes:
- /root/nginx-quic/conf.d:/etc/nginx/conf.d:ro
- /etc/nginx/certs:/etc/nginx/certs:ro
expose:
- "8081" # 只在 Docker 内网可访问,不映射到宿主机
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
caddy_data:
caddy_config:我们在 /opt/caddy/ 目录下面新建一个 .env 文件(在 docker-compose.yml 同级目录下创建一个名为 .env 的文件(如果还没有的话),并将 Token 写入其中),文件内容:
# .env 文件内容 CLOUDFLARE_API_TOKEN=这里填写你真实的Token字符串
修改完配置后,必须重新创建容器才能生效:
# 检查配置是否正确读取(可选,用来验证变量是否解析成功) docker-compose config # 重新启动 docker-compose up -d
通过上面的操作,我们就完成了通配符在 Caddy 证书的申请。
其它相关推荐:
4、
5、
评论列表