Рейтинг:0

Kubernetes Nginx Ingress с Cert Manager и letsencrypt не допускает использование подстановочных знаков в доменных именах

флаг ru

У меня есть собственный кластер Kubernetes с Nginx Ingress. На кластере также работает Cert-manager, с помощью которого я пытаюсь получить действительные SSL-сертификаты с помощью Letsencrypt. Все работает и я получаю действующий сертификат для example.com, www.example.com или app1.example.com, но не для общего подстановочного знака *.example.com. Если я попытаюсь каким-либо образом ввести подстановочный знак при входе в sec.tls.hosts, для меня не будет создан сертификат. Я получаю вывод для

kubectl получить сертификат

ИМЯ ГОТОВ ТАЙНЫЙ ВОЗРАСТ
tls-test-cert False tls-electi-cert 20h

kubectl получить запрос сертификата

ИМЯ УТВЕРЖДЕНО ОТКАЗАНО ГОТОВО ЭМИТЕНТ ЗАПРОС ВОЗРАСТ
tls-test-cert-8jw75 Верно Неверно letsencrypt-staging system:serviceaccount:cert-manager:cert-manager 18 м

kubectl описать CertificateRequest

[...]
Положение дел:
  Условия:
    Время последнего перехода: 2022-02-27T13:54:38Z
    Сообщение: Запрос сертификата одобрен cert-manager.io
    Причина: cert-manager.io
    Статус: Верно
    Тип: Утверждено
    Время последнего перехода: 2022-02-27T13:54:38Z
    Сообщение: Ожидание выдачи сертификата от шлюза заказа/tls-test-cert-8jw75-1425588341: "ожидание"
    Причина: Ожидание
    Статус: Ложь
    Тип: Готовый
События:
  Тип Причина Возраст от сообщения
  ---- ------ ---- ---- -------
  Обычный cert-manager.io 18 минут cert-manager Запрос сертификата одобрен cert-manager.io
  Обычный OrderCreated 18m cert-manager Created Order resource gateway/tls-test-cert-8jw75-1425588341
  Обычный OrderPending 18m cert-manager Ожидание выдачи сертификата от шлюза заказа/tls-test-cert-8jw75-1425588341: ""

Мой Nginx Ingress: (для этого поста я поменял свой домен на example.com)

---
Версия API: networking.k8s.io/v1
вид: Вход
метаданные:
  Название: тест-менеджмент
  пространство имен: шлюз
  аннотации:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-протокол: «HTTP»
спецификация:
  ingressClassName: nginx
  тлс:
  - secretName: tls-тест-сертификат
    хосты:
      - пример.com
      - '*.example.com'
  правила:
    - хост: example.com
      http:
        пути:
          - дорожка: /
            тип пути: префикс
            серверная часть:
              оказание услуг:
                имя: тестовый шлюз
                порт:
                  номер: 80
    - хост: '*.example.com'
      http:
        пути:
          - дорожка: /
            тип пути: префикс
            серверная часть:
              оказание услуг:
                имя: тестовый шлюз
                порт:
                  номер: 80

Эмитент: (здесь я отредактировал свое электронное письмо)

apiVersion: cert-manager.io/v1
вид: Эмитент
метаданные:
  имя: letsencrypt-staging
  пространство имен: cert-manager
спецификация:
  акме:
    сервер: https://acme-staging-v02.api.letsencrypt.org/directory
    электронное письмо: *******
    privateKeySecretRef:
      имя: letsencrypt-staging
    решатели:
      - http01:
          вход:
            класс: nginx

Мой обратный прокси (тестовый шлюз) определенно работает и перенаправляет все поддомены на мой сайт. Заранее спасибо за любые идеи относительно того, что может быть причиной этого.

флаг in
Привет, TaLeDa, добро пожаловать в Сан-Франциско. Насколько мне известно, [нельзя выдавать подстановочные сертификаты с помощью верификатора http01](https://cert-manager.io/docs/faq/sync-secrets/#serving-a-wildcard-to-ingress-resources-in - Different-namespaces-default-ssl-certificate) (поскольку для проверки всех хостов `*` потребуется неограниченное количество HTTP-запросов). Вам будет удобнее запросить сертификат [`wildcard: true`](https://cert-manager.io/docs/reference/api-docs/#acme.cert-manager.io/v1.Challenge), а затем просто прикрепив его к вашему Ingress. Удачи!
TaLeDa avatar
флаг ru
Спасибо, это решило мою проблему. Хорошего дня.
флаг in
Тогда, пожалуйста, [добавьте и примите свой собственный ответ](https://serverfault.com/help/self-answer), чтобы другие могли извлечь пользу из вашего опыта - в этом весь смысл этого сайта.
Рейтинг:0
флаг ru

Спасибо за помощь, я смог решить свою проблему:

По сути, мне пришлось найти новый подход, потому что с http01 не может быть выдан подстановочный сертификат. (глянь сюда: https://cert-manager.io/docs/configuration/acme/) После небольшого исследования я пришел к выводу, что наиболее целесообразно использовать решатель dns01. Документацию можно найти здесь: https://cert-manager.io/docs/configuration/acme/dns01/

Поскольку конфигурация dns01 сильно зависит от вашего DNS-провайдера, я не буду публиковать здесь свое решение, но полезную конфигурацию можно легко найти в документации.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.