使用带有 docker 的 Traefik 从 let's encrypt 获取证书时出现问题

Problem getting certificate from let's encrypt using Traefik with docker

我已经使用 Docker 设置了 Traefik,并在其背后提供了一项服务。基本设置有效。我可以使用重定向到 https 的域名浏览到端口 80,然后看到 "invalid certificate" - 因为 let's encrypt 部分已损坏。

[ 路由器 ] <-:80/:443-> [linux/docker [Traefik:80/:443][服务:8080]]

这是日志中的条目(已编辑域。)

日志:

acme: Error -> One or more domains had a problem:\n[xyz.example.net] acme: error: 400 :: urn:ietf:params:acme:error:connection :: Fetching http://xyz.example.net/.well-known/acme-challenge/eIAFZqaGMHMWaBjINjzk4m8PuWiYfuCHCTnSU9M: Error getting validation data, url: \n"

错误消息是准确的,我无法浏览到 URL。我注意到我可以使用内部 IP http://10.0.0.21/.well-known/acme-challenge/key 转到那个 URL 并且 Traefik 在日志中对此做出响应:

traefik | time="2019-05-28T21:20:52Z" level=error msg="Error getting challenge for token retrying in 542.914495ms"

我怀疑是域名重定向设置的问题。我的服务在 xyz.example.net(Traefik 也是。)我怀疑问题是 Traefik 正在将进入 xyz.example.net:80/:443 的所有流量重定向到服务,而不是处理 ./well-known/acme-challenge 本身。我需要给网关本身起个名字吗? (例如 zzz.example.net 是 Traefik 而 xyz.example.net 是服务?)

我该如何解决这个问题?

我的 TOML 文件:

debug = false

logLevel = "ERROR" #DEBUG, INFO, WARN, ERROR, FATAL, PANIC
InsecureSkipVerify = true
defaultEntryPoints = ["https", "http"]

[entryPoints]
  [entryPoints.http]
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.net"
watch = true
exposedbydefault = false

[acme]
email = "me@example.net"
storage = "acme.json"
entryPoint = "https"
onDemand = false 

onHostRule = true
[acme.httpChallenge]
entryPoint = "http"

我注意到虽然内部 IP 192.xxx 有效,但外部 IP 无效。当然,我会说,这似乎是一个防火墙问题 - 但是 - 防火墙允许流量通过我正在测试的服务,所以我很困惑。

解决办法? 端口 80 未在防火墙上转发,端口 443 转发。因此,当我尝试使用 curl/browser 进行测试时,我输入了 https://xyz.example.com - 并且有效。