使用Docker后端时Traefi不为子域名生成Let's Encrypt证书求助
解决Traefik 1.5 + Docker环境下子域名无法获取Let's Encrypt证书的问题
我来帮你排查这个头疼的问题——主域名能正常拿证,但子域名不行,大概率是配置细节或者验证环节出了疏漏,咱们一步步来梳理:
1. 先确认最基础的DNS解析是否正确
Let's Encrypt要验证你对子域名的控制权,首先得确保子域名的DNS解析完全正确:
- 用
nslookup subdomain.yourdomain.com或dig subdomain.yourdomain.com检查,子域名必须指向和主域名完全相同的服务器IP - 如果是用CDN或者域名托管商的解析,要确认没有设置错误的跳转或代理规则
2. 检查Traefik的ACME核心配置
你的traefik.toml里必须包含正确的ACME配置,尤其是自动为子域名申请证书的关键开关:
defaultEntryPoints = ["http", "https"] [web] address = ":8080" [entryPoints] [entryPoints.http] address = ":80" # 可选但推荐:把HTTP请求重定向到HTTPS [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] # 重点:ACME证书配置 [acme] email = "your-email@example.com" # 必填,用于证书过期提醒 storage = "/etc/traefik/acme.json" # 证书存储路径,确保容器能读写 entryPoint = "https" onHostRule = true # 关键开关:自动识别Docker容器的Host规则并申请证书 acmeLogging = true # 开启日志方便排查问题 [acme.httpChallenge] entryPoint = "http" # 用HTTP-01验证,必须确保80端口对外开放
注意:acme.json文件权限必须设为600,否则Traefik无法写入证书,执行chmod 600 acme.json即可。
3. 验证Docker容器的标签配置
每个需要子域名证书的容器,必须配置正确的Traefik标签,缺一不可:
docker run -d \ --label traefik.enable=true \ --label traefik.frontend.rule=Host:subdomain.yourdomain.com \ --label traefik.port=80 # 这里填容器内部实际提供服务的端口(比如Nginx的80) your-image-name
- 别漏了
traefik.enable=true,否则Traefik会忽略这个容器 traefik.port必须和容器内服务的监听端口一致,不能随便填
4. 通过日志定位具体错误
如果前面的配置都没问题,开启Traefik的debug日志来抓细节:
docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $PWD/traefik.toml:/etc/traefik/traefik.toml \ -v $PWD/acme.json:/etc/traefik/acme.json \ -p 80:80 \ -p 443:443 \ -p 8080:8080 \ traefik:1.5 --debug
然后查看日志:
docker logs <你的Traefik容器ID>
搜索acme相关的日志,比如Could not obtain certificate,里面会明确告诉你失败原因——比如DNS解析超时、HTTP挑战无法访问、Let's Encrypt速率限制等。
额外提示:通配符证书的可选方案
如果你的子域名数量很多,不想逐个申请证书,可以考虑用通配符证书。但Traefik 1.5需要用DNS-01挑战来获取通配符证书,这需要你配置域名服务商的API密钥(比如Cloudflare、Route53等),具体可以参考Traefik 1.5的官方文档中ACME DNS挑战的配置。
内容的提问来源于stack exchange,提问作者aliciahsteen
相关产品推荐
相关产品推荐

