我决定从jwilder / nginx-proxy切换到traefik,因为我想基于URI-path路由到容器,而jwilder / nginx-proxy不可能,但是应该与traefik兼容。
要做到这一点,我首先要转换已经使用let-encrypt的当前设置(在路由到一个容器的单个域上)。
我的问题是:如何获得traefik给我正确的由let-encrypt签名的证书,而不是自签名的东西?
所以我在使用acme设置的docker容器中有traefik。 我首先尝试使用HTTP-01挑战没有成功,但后来还是决定使用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前端时,为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(而非URL /域)到达服务器时获得的“ TRAEFIK DEFAULT CERT”,但这似乎无关紧要。
我仍然拥有以前设置中的证书/密钥,发行者在其中读取“ Let's Encrypt Authority X3,让我们对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"
答案 0 :(得分:0)
我从traefik.toml获得的样本指向登台目录https://acme-staging-v02.api.letsencrypt.org/directory
在其他应用程序中也称为“空运行”。
我通过谷歌搜索“ Fake LE Intermediate X1”发现了这一点。
将变量更改为https://acme-v02.api.letsencrypt.org/directory并擦除acme.json后,我得到了可用的证书。 \ O /