Traefik+Let’s Encrypt无法获取ACME证书问题求助
我通过Docker容器部署Traefik,期望借助Let’s Encrypt获取SSL证书。服务器已开放80、443端口(22端口SSH连接正常),且无其他防火墙运行。
出现如下错误:
level=error msg="Unable to obtain ACME certificate for domains "....": cannot get ACME client get directory at 'https://acme-v02.api.letsencrypt.org/directory': Get "https://acme-v02.api.letsencrypt.org/directory": dial tcp: lookup acme-v02.api.letsencrypt.org on 127.0.0.11:53: read udp 127.0.0.1:49988->127.0.0.11:53: i/o timeout" ACME CA="https://acme-v02.api.letsencrypt.org/directory" routerName=nginx@docker rule="Host(
Subdomain.MYDOMAIN)" providerName=myresolver.acme
当前使用的docker-compose.yml配置:
version: '3' services: traefik: image: "traefik:v2.7" command: # #- "--log.level=DEBUG" - "--api.insecure=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.tlschallenge=true" - "--certificatesresolvers.myresolver.acme.email=MYEMAIL" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" ports: - "80:80" - "443:443" # - "8080:8080" volumes: - "./letsencrypt:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro" # basic nginx container nginx: image: "nginx" networks: - default ports: - 9000:9000 labels: - "traefik.enable=true" - "traefik.http.routers.nginx.rule=Host(`MYDOMAIN`)" - "traefik.http.routers.nginx.service=nginx" - "traefik.http.services.nginx.loadbalancer.server.port=9000" - "traefik.http.routers.nginx.entrypoints=websecure" - "traefik.http.routers.nginx.tls.certresolver=myresolver"
已完成的操作:
- 创建权限为600的
acme.json文件 - 提供了定义入口点的
traefik.toml - 确认服务器与域名均来自Strato,DNS解析指向当前IP
- 尝试关闭所有防火墙、更换多种配置方案,问题仍未解决
该错误核心是Traefik容器内部DNS解析超时,127.0.0.11是Docker内置DNS服务,超时说明容器无法正常解析外部域名,可按以下步骤排查修复:
1. 手动指定外部DNS服务器
绕过Docker内置DNS,给Traefik容器配置公共DNS服务器,在docker-compose.yml的traefik服务中添加dns字段:
traefik: image: "traefik:v2.7" dns: - 8.8.8.8 - 1.1.1.1 # 其余原有配置保持不变
2. 启用HTTP入口点
虽然使用TLS Challenge,但Traefik完成ACME流程可能依赖HTTP入口点的前置验证,在traefik的command中添加以下配置:
command: # 保留原有配置 - "--entrypoints.web.address=:80" - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
3. 验证容器网络连通性
进入Traefik容器手动测试DNS解析与网络连通性,确认问题根源:
# 获取Traefik容器ID docker ps | grep traefik # 进入容器 docker exec -it <容器ID> sh # 测试DNS解析 nslookup acme-v02.api.letsencrypt.org # 测试HTTPS连通 curl https://acme-v02.api.letsencrypt.org/directory
如果nslookup失败,说明DNS配置存在问题;如果curl失败,需检查服务器是否被限制访问Let’s Encrypt的API接口。
4. 检查Strato主机网络限制
Strato服务器可能默认限制出站流量或DNS服务,可联系主机商确认:
- 是否允许访问443端口到外部(Let’s Encrypt API依赖443端口)
- 是否允许自定义外部DNS服务器
- 是否存在未关闭的内部防火墙/安全规则
5. 清理并重新部署容器
删除旧容器与无用网络,重新部署服务:
docker-compose down docker network prune -f docker-compose up -d
内容的提问来源于stack exchange,提问作者Andreas Wagner

