在 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
。
这里:
你的 defaultEntrypoints
是 http
您的 ACME 入口点是 https
所以当你的前端被创建时,它被分配给 http
,这就是你没有任何挑战的原因。
然后,您的日志只说当您尝试访问 https://example.com 时,Træfik 会尝试在已被挑战的 ACME 证书中查找证书。
为了修复,您需要指定 defaultEntrypoints
和 https
(如果需要,还可以指定 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
在尝试升级到最新的 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
。
这里:
你的 defaultEntrypoints
是 http
您的 ACME 入口点是 https
所以当你的前端被创建时,它被分配给 http
,这就是你没有任何挑战的原因。
然后,您的日志只说当您尝试访问 https://example.com 时,Træfik 会尝试在已被挑战的 ACME 证书中查找证书。
为了修复,您需要指定 defaultEntrypoints
和 https
(如果需要,还可以指定 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