文章内容

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-01tls-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 证书的申请。


其它相关推荐:

1、Caddy 服务器

2、Caddy Docker 镜像启用 Brotli 压缩

3、Zstd 压缩 Brotli 压缩 Gzip 压缩对比

4、

5、

分享到:

发表评论

评论列表