在尝试升级到最新的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
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)
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文件,以确定是否存在问题。
答案 0 :(得分:0)
onHostRule
尝试在前端拥有与ACME EntryPoint相同的入口点的HostRule时挑战ACME证书。
加载新前端时,他们会使用您指定的入口点或defaultEntrypoints
。
下面:
您的defaultEntrypoints
是http
您的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