在 Traefik 1.5.0-rc5 中获取新的 httpChallenge 的问题

Issues getting new httpChallenge working in Traefik 1.5.0-rc5

在尝试升级到最新的 traefik 版本以便能够从 LetsEncrypt 生成 TLS 证书时,我遇到了一个关于证书生成时间的问题。

这之前在 traefik:1.4 上使用 acme.ondemand 标志和其他设置(当然减去 httpChallenge 键)。

配置:

traefik:
  image: traefik:1.5.0-rc5-alpine
  ports:
    - 80:80/tcp
    - 443:443/tcp
  command:
    - --web
    - --rancher
    - --rancher.metadata
    - --acme
    - --acme.email=my@email.com
    - --acme.onhostrule
    - --acme.httpchallenge
    - --acme.httpchallenge.entrypoint=http
    - --acme.entrypoint=https
    - --acme.storage=/data/acme.json
    - --entryPoints=Name:http Address::80 Redirect.EntryPoint:https
    - --entryPoints=Name:https Address::443 TLS
    - --accesslog
    - --accesslog.format=json
    - --debug

Openssl s_client 尚未存在的证书结果

CONNECTED(00000003)
depth=0 /CN=TRAEFIK DEFAULT CERT
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /CN=TRAEFIK DEFAULT CERT
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/CN=TRAEFIK DEFAULT CERT
  i:/CN=TRAEFIK DEFAULT CERT
---
...
Verify return code: 21 (unable to verify the first certificate)

Traefik 日志

time="2018-01-16T19:17:49Z" level=debug msg="Looking for provided certificate to validate [mysite.com]..." time="2018-01-16T19:17:49Z" level=debug msg="No provided certificate found for domains [mysite.com], get ACME certificate." time="2018-01-16T19:17:49Z" level=debug msg="Looking for an existing ACME challenge for mysite.com..." time="2018-01-16T19:17:49Z" level=debug msg="No certificate found or generated for mysite.com"

正在尝试缩小到只有一个具有相同配置的 toml 文件以确定是否是问题所在。

当您在具有与 ACME EntryPoint 相同的入口点的前端上具有 HostRule 时,onHostRule 尝试挑战 ACME 证书。

加载新前端时,它们使用您指定的入口点或 defaultEntrypoints

这里: 你的 defaultEntrypointshttp 您的 ACME 入口点是 https

所以当你的前端被创建时,它被分配给 http,这就是你没有任何挑战的原因。

然后,您的日志只说当您尝试访问 https://example.com 时,Træfik 会尝试在已被挑战的 ACME 证书中查找证书。

为了修复,您需要指定 defaultEntrypointshttps(如果需要,还可以指定 http

我发现最后,问题实际上是我的集群中 运行 没有与我正在测试的主机相匹配的容器。

我正在使用 openssl s_client -connect host:443 -servername mysite.com,但是我没有意识到在我所针对的集群中,没有标签为 traefik.frontend.rule=Host:mysite.com 的容器。

因此,从 traefik 的角度来看,我只是得到了 404,最终使用了默认的 traefik 证书。卷曲时 - 我从来没有得到 404,因为我从来没有通过 TLS 握手。

您可以尝试添加 traefik.toml 的代码段结尾,它可能会对您有所帮助

[docker]
  endpoint = "unix:///var/run/docker.sock"
  watch = true