Treafik использует сертификат ПО УМОЛЧАНИЮ вместо использования подстановочного сертификата Let’s Encrypt

#ssl #kubernetes #lets-encrypt #traefik #traefik-ingress

#ssl #kubernetes #позволяет зашифровать #traefik #traefik-вход

Вопрос:

Я пытаюсь настроить Traefik для получения сертификатов от Let’s Encrypt с помощью DNS challenge и защитить приложение whoami этим сертификатом. Мне удается получить сертификат (хорошо присутствующий в файле acme.json), но мой IngressRoute не использует этот сертификат для маршрута.

Мой кластер — это кластер K3D. Я развертываю Traefik v2 из официальной таблицы Helm: helm устанавливает traefik traefik/ traefik -f traefik-values.yaml

Я определил эти значения для диаграммы :

 additionalArguments:
  - --log.level=TRACE
  - --certificatesresolvers.le.acme.email=<MY_EMAIL>
  - --certificatesresolvers.le.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory
  - --certificatesresolvers.le.acme.dnschallenge=true
  - --certificatesresolvers.le.acme.dnschallenge.provider=route53
  - --certificatesresolvers.le.acme.dnschallenge.delayBeforeCheck=60
  - --certificatesresolvers.le.acme.dnschallenge.resolvers=8.8.8.8:53
  - --certificatesresolvers.le.acme.storage=/data/acme.json
  - --entrypoints.web.http.redirections.entryPoint.to=:443
  - --entrypoints.web.http.redirections.entryPoint.scheme=https
persistence:
  enabled: true
  path: /data
env:
  - name: AWS_REGION
    value: eu-west-1
  - name: AWS_HOSTED_ZONE_ID
    value: <MY_AWS_HOSTED_ZONE_ID>
  - name: AWS_ACCESS_KEY_ID
    value: <MY_AWS_ACCESS_KEY_ID>
  - name: AWS_SECRET_ACCESS_KEY
    value: <MY_AWS_SECRET_ACCESS_KEY>
  

Развертывание, обслуживание и IngressRoute для приложения whoami :

 kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: containous/whoami:v1.5.0
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  type: ClusterIP
  ports:
    - port: 80
      name: whoami
  selector:
    app: whoami
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: app-tls
spec:
  entryPoints:
    - websecure
  routes:
    - kind: Rule
      match: Host(`test.mydomain.com`) || Path(`/whoami`)
      services:
        - name: whoami
          port: 80
  tls:
    certResolver: le
    domains:
      - main: "*.test.mydomain.com"
  

В журналах я вижу :

 time="2020-09-24T14:04:04Z" level=debug msg="legolog: [INFO] acme: Registering account for MY_EMAIL"
time="2020-09-24T14:04:04Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: Obtaining bundled SAN certificate"
time="2020-09-24T14:04:04Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/118300931"
time="2020-09-24T14:04:04Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: use dns-01 solver"
time="2020-09-24T14:04:04Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: Preparing to solve DNS-01"
time="2020-09-24T14:04:05Z" level=debug msg="legolog: [INFO] Wait for route53 [timeout: 2m0s, interval: 4s]"
time="2020-09-24T14:05:16Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: Trying to solve DNS-01"
time="2020-09-24T14:05:16Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: Checking DNS record propagation using [8.8.8.8:53]"
time="2020-09-24T14:05:20Z" level=debug msg="legolog: [INFO] Wait for propagation [timeout: 2m0s, interval: 4s]"
time="2020-09-24T14:06:24Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] The server validated our request"
time="2020-09-24T14:06:24Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: Cleaning DNS-01 challenge"
time="2020-09-24T14:06:25Z" level=debug msg="legolog: [INFO] Wait for route53 [timeout: 2m0s, interval: 4s]"
time="2020-09-24T14:07:21Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] acme: Validations succeeded; requesting certificates"
time="2020-09-24T14:07:23Z" level=debug msg="legolog: [INFO] [*.test.mydomain.com] Server responded with a certificate."
  

И затем :

 time="2020-09-24T14:07:24Z" level=debug msg="Looking for provided certificate(s) to validate ["*.test.mydomain.com"]..." providerName=le.acme
time="2020-09-24T14:07:24Z" level=debug msg="No ACME certificate generation required for domains ["*.test.mydomain.com"]." providerName=le.acme
  

Когда я захожу на localhost / whoami из браузера, я вижу приложение whoami, но используемый сертификат является сертификатом по умолчанию от Traefik.
Проблема та же, что и с сертификатом без подстановочных знаков.

Почему сертификат файла не используется для моего маршрута?

Заранее благодарю вас за помощь.

Ответ №1:

Я только что перенес свой веб-сайт с new.example.com на example.com тот, который был связан со старой версией веб-сайта, размещенного на другом сервере.

Вместо автоматического сертификата Let’s encrypt traefik использовал сертификат по умолчанию. Через час после изменения записей dns он только начал использовать автоматический сертификат. Я не вносил обновления в конфигурацию. Я думаю, что это может быть связано с этим, и эти проблемы опубликованы на github traefik.

Если это, на самом деле, связано с «проблемой курицы и яйца, поскольку домен не следует перемещать на новый сервер до того, как ключи заработают, и ключи не могут быть запрошены до того, как домен заработает«, я бы рекомендовал использовать пользовательские сертификаты в течение 24 часов после обновления dns. Тогда должно быть безопасно вернуться к автоматическим сертификатам.

Некоторые подробности

Я использовал конфигурацию acme из документов:

 certificatesResolvers:
  myresolver:
    acme:
      email: your-email@example.com
      storage: acme.json
      httpChallenge:
        # used during the challenge
        entryPoint: web
  

Странная вещь заключалась в том, что /etc/traefik/acme/acme.json он содержал закрытый ключ, хотя я не знаю, как он должен работать.

 {
  "letsencrypt": {
    "Account": {
      "Email": "example@mail.com",
      "Registration": {
        "body": {
          "status": "valid",
          "contact": [
            "mailto:example@mail.com"
          ]
        },
        "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/*******"
      },
      "PrivateKey": "*******************************************",
      "KeyType": "4096"
    },
    "Certificates": null
  }
}
  

Кроме того, я пару раз использовал docker и перезапускал контейнер без каких-либо проблем. После последнего перезапуска он только начал работать.