无法配置Traefik仅为DuckDNS生成Let's Encrypt通配符证书
解决Traefik为DuckDNS生成通配符证书的问题
要生成*.mydomain.duckdns.org通配符证书并让所有子域名复用,需要调整Traefik的静态和动态配置,明确指定通配符域名需求,同时修正DNS挑战的配置错误。
1. 修正静态配置(traefik.yml)
移除DNS resolvers中的多余转义引号(YAML语法不需要转义双引号),确保DNS服务器地址正确解析:
# traefik.yml entryPoints: web: address: :80 websecure: address: :443 certificatesResolvers: letsencrypt: acme: email: myemail storage: /letsencrypt/acme.json dnsChallenge: provider: duckdns # 先保留这两个参数确保证书生成稳定,后续可尝试移除 disablePropagationCheck: true delayBeforeCheck: 60s resolvers: - "1.1.1.1:53" - "8.8.8.8:53" api: insecure: true providers: file: filename: /config/dynamic.yml watch: true log: level: DEBUG
2. 修改动态配置(dynamic.yml)
在每个路由的TLS配置中添加domains字段,指定主域名和通配符SAN,让Traefik统一请求通配符证书:
# dynamic.yml http: routers: whoami: rule: Host(`whoami.mydomain.duckdns.org`) service: whoami entryPoints: - websecure tls: certResolver: letsencrypt domains: - main: "mydomain.duckdns.org" sans: - "*.mydomain.duckdns.org" portainer: rule: Host(`portainer.mydomain.duckdns.org`) service: portainer entryPoints: - websecure tls: certResolver: letsencrypt domains: - main: "mydomain.duckdns.org" sans: - "*.mydomain.duckdns.org" services: whoami: loadBalancer: servers: - url: http://whoami:80 portainer: loadBalancer: servers: - url: http://portainer:9000
3. 清理旧证书并重启服务
- 停止Traefik容器:
docker stop traefik - 删除旧的ACME存储文件(避免复用单域名证书):
rm ./traefik/letsencrypt/acme.json - 重启Traefik:
docker-compose up -d traefik
验证方法
- 查看Traefik日志,确认ACME resolver成功生成
*.mydomain.duckdns.org证书 - 访问两个子域名,检查浏览器证书信息,确认两者使用同一张通配符证书
关键说明
tls.domains字段告诉ACME resolver要生成包含通配符的SAN证书,而非单独为每个子域名申请- 修正DNS resolvers的转义问题,确保Traefik能正确验证DNS记录传播状态
- 清理旧证书是为了强制Traefik重新发起通配符证书请求,避免复用历史证书
内容的提问来源于stack exchange,提问作者João Casarin
相关产品推荐
相关产品推荐

