Я решил переключиться с jwilder / nginx-proxy на traefik, так как я хочу направить в контейнеры на основе URI-пути, что невозможно с jwilder / nginx-proxy, но должно быть с traefik.
Для этого я сначала хотел преобразовать мою текущую настройку (для одного домена, перенаправленного в один контейнер), которая уже использовала let-encrypt.
У меня вопрос: как мне заставить traefik выдать мне надлежащий сертификат, подписанный с помощью let-encrypt, вместо самозаверяющего предмета?
Итак, у меня есть traefik в контейнере докера, настроенный с помощью acme.
Сначала я безуспешно пытался использовать HTTP-01-challenge, но затем все равно решил использовать TLS-ALPN-01.
После запуска контейнера (и некоторого ожидания) журнал наконец читает (конфиденциальная информация заменена на X):
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» он читает (конфиденциальная информация снова заменяется на X):
{
"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 Strict Transport Security (HSTS), SEC_ERROR_UNKNOWN_ISSUER).
Домен сертификата показывает правильный домен, который я дал traefik для внешнего интерфейса, но издатель читает «Fake LE Intermediate X1», который не похож на некоторые вещи, позволяющие зашифровать.
Сохраненный файл acme.json (yes traefik настроен с хранилищем файлов) имеет запись сертификата (base64), которая при декодировании открывает два сертификата.
Использование https://www.sslshopper.com/certificate-decoder.html Я обнаружил, что первый - это тот же сертификат, который отвергают мои браузеры, а второй - также "Fake LE Intermediate X1". Оба не выглядят как «TRAEFIK DEFAULT CERT», который вы получаете, когда пытаетесь получить доступ к серверу через IP (не URL / домен), но это не имеет значения.
У меня все еще есть сертификаты / ключи из моей предыдущей установки, где издатель читает «Let's Encrypt Authority X3, Let's Encrypt Write review for 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"