Traefik 在完成 tls-alpn-01 挑战后使用没有链的证书

Traefik uses a certificate whithout chain after completing tls-alpn-01 challenge

我决定从 jwilder/nginx-proxy 切换到 traefik,因为我想根据 URI 路径路由到容器,这在 jwilder/nginx-proxy 中是不可能的,但应该在 traefik 中。

为此,我首先想转换已经使用 lets-encrypt 的当前设置(在路由到单个容器的单个域上)。

我的问题是:如何让 traefik 给我由 lets-encrypt 签名的正确证书而不是自签名的证书?

所以我在使用 acme 设置的 docker 容器中安装了 traefik。 我首先尝试使用 HTTP-01-challenge 但没有成功,但后来决定无论如何都要使用 TLS-ALPN-01。

容器启动(并等待一段时间)后,日志最终读取(敏感信息替换为 Xs):

time="2019-05-30T20:01:25Z" level=info msg="legolog: [INFO] acme: Registering account for XXXXXXXX@XXXXXXXX.XXXXXXXX"
time="2019-05-30T20:01:25Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] acme: Obtaining bundled SAN certificate"
time="2019-05-30T20:01:26Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/XXXXXXXX"
time="2019-05-30T20:01:26Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] acme: use tls-alpn-01 solver"
time="2019-05-30T20:01:26Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] acme: Trying to solve TLS-ALPN-01"
time="2019-05-30T20:01:33Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] The server validated our request"
time="2019-05-30T20:01:33Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] acme: Validations succeeded; requesting certificates"
time="2019-05-30T20:02:17Z" level=info msg="legolog: [INFO] [XXXXXXXX.ddns.net] Server responded with a certificate."

导航到“AuthURL 时,它读取(敏感信息再次替换为 Xs):

{
"identifier": {
"type": "dns",
"value": "XXXXXXXX.ddns.net"
},
"status": "valid",
"expires": "2019-06-29T20:01:29Z",
"challenges": [
{
"type": "dns-01",
"status": "pending",
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/challenge/XXXXXXXX/XXXXXXXX",
"token": "XXXXXXXX"
},
{
"type": "http-01",
"status": "pending",
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/challenge/XXXXXXXX/XXXXXXXX",
"token": "XXXXXXXX"
},
{
"type": "tls-alpn-01",
"status": "valid",
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/challenge/XXXXXXXX/XXXXXXXX",
"token": "XXXXXXXX",
"validationRecord": [
{
  "hostname": "XXXXXXXX.ddns.net",
  "port": "443",
  "addressesResolved": [
  "XXXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX"
  ],
  "addressUsed": "XXXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX"
}
]
}
]
}

所以我错误地认为一切都应该很好。

当导航到 traefik-frontend 时,为 firefox 颁发的证书显示没有链的证书(我想是自签名的)自然被拒绝(HTTP 严格传输安全(HSTS),SEC_ERROR_UNKNOWN_ISSUER ).

证书的域显示了我为前端提供的 traefik 的正确域,但颁发者读取的是 "Fake LE Intermediate X1",这看起来不像是让加密的东西。 保存的 acme.json(是的,traefik 配置了文件存储)有一个证书条目 (base64),解码后会显示两个证书。

使用 https://www.sslshopper.com/certificate-decoder.html 我发现第一个是我的浏览器拒绝的同一个证书,第二个也是 "Fake LE Intermediate X1"。两者看起来都不像您尝试通过 IP 访问服务器时得到的 "TRAEFIK DEFAULT CERT"(不是 URL/domain),但这似乎无关紧要。

我仍然有我以前设置的 certificates/keys,其中发行人读取 "Let's Encrypt Authority X3, Let's Encrypt Write review of Let's Encrypt"。我当然可以将它们粘贴到 acme.json 中,而不知道这是否可行。但是没过多久证书就过期了,我想我会遇到和现在一样的问题。

我的 traefik.toml 如下所示:

logLevel = "INFO"
defaultEntryPoints = ["http", "https"]


################################################################
# API and dashboard configuration
################################################################
[api]
################################################################
# Docker configuration backend
dashboard = true
################################################################

#[web]
#address = ":8080"
#  [web.auth.basic]
#    users = ["admin:traefikW0rd"]

[docker]
domain = "XXXXXXXX.ddns.net"
watch = true
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = false

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

[acme]
email = "XXXXXXXX@XXXXXXXX.XXXXXXXX"
storage = "/etc/traefik/ACME/acme.json"
keyType = "RSA4096"
caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"
acmeLogging = true
entryPoint = "https"
#OnHostRule = true
  [acme.tlsChallenge]
  entryPoint = "https"

[[acme.domains]]
  main = "XXXXXXXX.ddns.net"

我为我的 traefik.toml 获得的样本指向一个暂存目录 https://acme-staging-v02.api.letsencrypt.org/directory

这在其他应用程序中也称为 "dry-run"。

我通过谷歌搜索 "Fake LE Intermediate X1" 找到了这个。

将变量更改为 https://acme-v02.api.letsencrypt.org/directory 并擦除 acme.json 后,我获得了可用的证书。 \O/