You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:17:29