Пример заказа сертификата

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com                          # имя сертификата, через него потом можно смотреть статус
  namespace: default
spec:
  secretName: example-com-tls                # название секрета, в который положить приватный ключ и сертификат
  issuerRef:
    kind: ClusterIssuer                      # ссылка на "выдаватель" сертификатов, см. подробнее ниже
    name: letsencrypt
  commonName: example.com                    # основной домен сертификата
  dnsNames:                                  # дополнительыне домены сертификата (Как минимум одно DNS имя или IP-адрес должен быть указан)
  - www.example.com
  - admin.example.com

При этом:

  • создается отдельный Ingress-ресурс на время прохождения challenge’а (соответственно аутентификация и whitelist основного Ingress не будут мешать),
  • можно заказать один сертификат на несколько Ingress-ресурсов (и он не отвалится при удалении того, в котором была аннотация tls-acme),
  • можно заказать сертификат с дополнительными именами (как в примере),
  • можно валидировать разные домены, входящие в один сертификат, через разные Ingress-контроллеры.

Подробнее можно прочитать в документации cert-manager.

Заказ wildcard-сертификата с DNS в Cloudflare

  1. Получим Global API Key и Email Address:
    • Заходим на страницу: https://dash.cloudflare.com/profile.
    • В самом верху страницы написана ваша почта под Email Address.
    • В самом низу страницы жмем на кнопку View напротив Global API Key.

    В результате чего мы получаем ключ для взаимодействия с API Cloudflare и почту на которую зарегистрирован аккаунт.

  2. Редактируем настройки модуля cert-manager и добавляем такую секцию:

    settings:
      cloudflareGlobalAPIKey: APIkey
      cloudflareEmail: some@mail.somedomain
    

    или

    settings:
      cloudflareAPIToken: some-token
      cloudflareEmail: some@mail.somedomain
    

    После чего, Deckhouse автоматически создаст ClusterIssuer и Secret для Cloudflare в namespace d8-cert-manager.

    • Конфигурация с помощью APIToken является рекомендуемой и более безопасной.
  3. Создаем Certificate с проверкой с помощью провайдера Cloudflare. Данная возможность появится только при указании настройки cloudflareGlobalAPIKey и cloudflareEmail в Deckhouse:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: domain-wildcard
      namespace: app-namespace
    spec:
      secretName: tls-wildcard
      issuerRef:
        name: cloudflare
        kind: ClusterIssuer
      commonName: "*.domain.com"
      dnsNames:
      - "*.domain.com"
    
  4. Создаем Ingress:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: domain-wildcard
      namespace: app-namespace
    spec:
      ingressClassName: nginx
      rules:
      - host: "*.domain.com"
        http:
          paths:
          - backend:
              service:
                name: svc-web
                port:
                  number: 80
            path: /
      tls:
      - hosts:
        - "*.domain.com"
        secretName: tls-wildcard
    

Заказ wildcard-сертификата с DNS в Route53

  1. Создаем пользователя с необходимыми правами.

    • Заходим на страницу управления политиками. Создаем политику с такими правами:

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "route53:GetChange",
                  "Resource": "arn:aws:route53:::change/*"
              },
              {
                  "Effect": "Allow",
                  "Action": "route53:ChangeResourceRecordSets",
                  "Resource": "arn:aws:route53:::hostedzone/*"
              },
              {
                  "Effect": "Allow",
                  "Action": "route53:ListHostedZonesByName",
                  "Resource": "*"
              }
          ]
      }
      
    • Заходим на страницу управления пользователями. Создаем пользователя с созданной ранее политикой.

  2. Редактируем настройки модуля cert-manager и добавляем такую секцию:

    settings:
      route53AccessKeyID: AKIABROTAITAJMPASA4A
      route53SecretAccessKey: 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
    

    После чего, Deckhouse автоматически создаст ClusterIssuer и Secret для route53 в namespace d8-cert-manager.

  3. Создаем Certificate с проверкой с помощью провайдера route53. Данная возможность появится только при указании настроек route53AccessKeyID и route53SecretAccessKey в Deckhouse:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: domain-wildcard
      namespace: app-namespace
    spec:
      secretName: tls-wildcard
      issuerRef:
        name: route53
        kind: ClusterIssuer
      commonName: "*.domain.com"
      dnsNames:
      - "*.domain.com"
    

Заказ wildcard-сертификата с DNS в Google

  1. Создаем сервис-аккаунт с необходимой ролью.

    • Заходим на страницу управления политиками.
    • Выбираем нужный проект.
    • Создаем сервис-аккаунт с желаемым названием, например dns01-solver.
    • Заходим в созданный сервис-аккаунт.
    • Создаём ключ по кнопке “Добавить ключ”.
    • Будет скачан .json-файл с данными ключа имени.
    • Закодируем полученный файл в строку base64:

      base64 project-209317-556c656b81c4.json
      
  2. Сохраняеем полученную base64-строку в параметр модуля cloudDNSServiceAccount.

    После чего, Deckhouse автоматически создаст ClusterIssuer и Secret для cloudDNS в namespace d8-cert-manager.

  3. Создаем Certificate с валидацией через cloudDNS:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: domain-wildcard
      namespace: app-namespace
    spec:
      secretName: tls-wildcard
      issuerRef:
        name: clouddns
        kind: ClusterIssuer
      dnsNames:
      - "*.domain.com"
    

Заказ self-signed-сертификата

Все еще проще, чем с LetsEncypt. Просто меняем letsencrypt на selfsigned:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com                          # имя сертификата, через него потом можно смотреть статус
  namespace: default
spec:
  secretName: example-com-tls                # название секрета, в который положить приватный ключ и сертификат
  issuerRef:
    kind: ClusterIssuer                      # ссылка на "выдаватель" сертификатов, см. подробнее ниже
    name: selfsigned
  commonName: example.com                    # основной домен сертификата
  dnsNames:                                  # дополнительные домены сертификата, указывать не обязательно
  - www.example.com
  - admin.example.com