Traefik2.2.1配DigitalOcean的Let's Encrypt SSL证书报400超时求助
Traefik环境下主/子域名Let's Encrypt证书配置故障排查
基础环境说明
- 域名购置渠道:Namecheap,域名为spin360.digital
- 服务器部署:DigitalOcean Droplet,Ubuntu 20.04系统,Docker 19.03.12运行Node应用
- 已生效历史配置:2020年成功为api.spin360.digital申请Let's Encrypt证书,证书存储于Droplet本地acme.json文件,该域名HTTPS访问正常、证书受浏览器信任
- 本次目标:为新增的shopify.spin360.digital、bigcom.spin360.digital子域名配置HTTPS证书
- 运行版本:Traefik 2.2.1、Node.js 12
- 故障现象:Traefik启动后无法正常申请证书,日志报错
400 :: urn:ietf:params:acme:error:connection :: Timeout during connect (likely firewall problem),反复重启触发Let's Encrypt速率限制,提示too many failed authorizations recently
现有配置明细
DigitalOcean DNS记录
A spin360.digital | 指向xxx.xx.xxx.xxx | TTL 3600 A bigcom.spin360.digital | 指向xxx.xx.xxx.xxx | TTL 3600 A shopify.spin360.digital | 指向xxx.xx.xxx.xxx | TTL 3600 A api.spin360.digital | 指向xxx.xx.xxx.xxx | TTL 3600 CAA *.spin360.digital | 授权签发方:letsencrypt.org | TTL 3600 AAAA *.spin360.digital | 指向xxxx:xxxx:xxx:xx::xxx:xxx | TTL 3600 A *.spin360.digital | 指向xxx.xx.xxx.xxx | TTL 3600 AAAA spin360.digital | 指向xxxx:xxxx:xxx:xx::xxx:xxx | TTL 3600 NS spin360.digital | 指向ns1.digitalocean.com、ns2.digitalocean.com、ns3.digitalocean.com | TTL 1800
Traefik静态配置(traefik.toml)
logLevel = "DEBUG" [traefikLog] filePath = "atraefik.log" [accessLog] filePath = "access.log" [entryPoints] [entryPoints.web] address = ":80" [entryPoints.web.http.redirections.entryPoint] to = "websecure" scheme = "https" [entryPoints.websecure] address = ":443" [api] dashboard = true debug = true [certificatesResolvers.lets-encrypt.acme] email = "a.b@gmail.com" storage = "acme.json" [certificatesResolvers.lets-encrypt.acme.tlsChallenge] [providers.docker] watch = true network = "web" [providers.file] filename = "traefik_dynamic.toml"
Traefik动态配置(traefik_dynamic.toml)
[http.middlewares.simpleAuth.basicAuth] users = [ "xxx:xxx" ] [http.routers.api] rule ="Host(`spin360.digital`, `monitor.spin360.digital`,`shopify.spin360.digital`,`bigcom.spin360.digital`)" entrypoints = ["websecure"] middlewares = ["simpleAuth"] service = "api@internal" [http.routers.api.tls] certResolver = "lets-encrypt" [[http.routers.api.tls.domains]] main = "spin360.digital" sans = ["shopify.spin360.digital","bigcom.spin360.digital"]
防火墙配置
$ ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6)
Traefik启动命令
docker run \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $PWD/traefik.toml:/traefik.toml \ -v $PWD/traefik_dynamic.toml:/traefik_dynamic.toml \ -v $PWD/acme.json:/acme.json \ -p 80:80 \ -p 443:443 \ --network web \ --name traefik \ traefik:v2.2.1
故障根因与修复方案
1. DNS记录格式错误
原配置中的CAA记录存在复制残留(粘贴时附带了页面操作按钮的冗余文字Copywild),属于非法DNS记录格式,会导致Let's Encrypt校验签发授权时识别失败。需将CAA记录修正为标准格式:0 issue "letsencrypt.org",删除所有多余字符;同时删除重复配置的spin360.digital A记录,避免DNS解析冲突。
2. IPv6网络连通性问题
你为spin360.digital及通配符记录同时配置了A(IPv4)和AAAA(IPv6)记录,Let's Encrypt的验证服务器会优先尝试访问IPv6地址。若Droplet的IPv6路由未正确连通、存在网络层拦截,就会触发连接超时报错。
- 临时验证方案:暂时删除所有AAAA记录,等待DNS生效后重试证书申请
- 长期方案:若无需提供IPv6服务,直接删除所有AAAA记录;若需启用IPv6服务,需确认Droplet的IPv6地址配置正常、无安全组拦截
3. 动态配置规则不匹配
当前动态路由的Host规则匹配了4个域名,但TLS证书的域名字段仅定义了3个(主域名+2个待上线子域名),遗漏了monitor.spin360.digital,会导致Traefik反复触发证书申请流程。需调整规则:要么从Host匹配列表中删除暂不申请证书的域名,要么将该域名加入TLS证书的SAN列表。
4. 速率限制调试注意事项
Let's Encrypt的速率限制窗口最长为1小时,触发后需等待自动解除。调试期间需遵守以下规则避免重复触发:
- 调试阶段切换到Let's Encrypt staging环境,不会占用正式申请的额度
- 确保acme.json文件权限为
600(仅所有者可读可写),避免Traefik读取旧状态反复发起申请 - 先通过公网访问验证80、443端口连通性,再启动证书申请流程,不要每次改配置就反复重启Traefik
验证流程
- 从公网访问
http://spin360.digital,确认能正常收到Traefik返回的301跳转(跳转至HTTPS),无连接超时 - 确认所有待申请证书的域名解析到的IPv4地址与Droplet公网IP完全一致,无解析残留
- 等待速率限制窗口解除后,启动Traefik查看日志,确认证书获取成功
内容的提问来源于stack exchange,提问作者Vinayak Vanarse
相关产品推荐
相关产品推荐

