Я решил переключиться с 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 [email protected]"
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-frontend сертификат был выпущен для firefox, чтобы показать сертификат без цепочки (например, самоподписанный, я полагаю), который, естественно, отклоняется (HTTP Strict Transport Security (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». Оба НЕ похожи на «СЕРТИФИКАТ ПО УМОЛЧАНИЮ TRAEFIK», который вы получаете, когда пытаетесь получить доступ к серверу через IP (не URL / домен), но это кажется несущественным.
У меня все еще есть сертификаты / ключи из моей предыдущей настройки, где эмитент читает «Let's Encrypt Authority X3, Let's Encrypt Написать обзор 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 = "[email protected]"
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"