在Traefik 1.5.0-rc5中使用新的httpChallenge的问题

时间:2018-01-16 19:26:04

标签: ssl docker traefik

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

以前在traefik:1.4使用acme.ondemand标志和其他设置(当然减去httpChallenge键)。{/ p>

配置:

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文件,以确定是否存在问题。

3 个答案:

答案 0 :(得分:0)

onHostRule尝试在前端拥有与ACME EntryPoint相同的入口点的HostRule时挑战ACME证书。

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

下面: 您的defaultEntrypointshttp 您的ACME EntryPoint为https

因此,当您的前端创建时,它被分配到http,这就是您没有任何挑战的原因。

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

为了解决问题,您需要使用defaultEntrypoints指定https(如果需要,还需要http

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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