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

1apiVersion: cert-manager.io/v1
2kind: Certificate
3metadata:
4  name: example-com                          # Имя сертификата, через него потом можно смотреть статус.
5  namespace: default
6spec:
7  secretName: example-com-tls                # Название Secret'а, в который положить приватный ключ и сертификат.
8  issuerRef:
9    kind: ClusterIssuer                      # Ссылка на "выдаватель" сертификатов, см. подробнее ниже.
10    name: letsencrypt
11  commonName: example.com                    # Основной домен сертификата.
12  dnsNames:                                  # Дополнительные домены сертификата (как минимум одно DNS-имя или IP-адрес должны быть указаны).
13  - www.example.com
14  - 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 и добавляем такую секцию:

    1settings:
    2  cloudflareGlobalAPIKey: APIkey
    3  cloudflareEmail: some@mail.somedomain
    

    или

    1settings:
    2  cloudflareAPIToken: some-token
    3  cloudflareEmail: some@mail.somedomain
    

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

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

    1apiVersion: cert-manager.io/v1
    2kind: Certificate
    3metadata:
    4  name: domain-wildcard
    5  namespace: app-namespace
    6spec:
    7  secretName: tls-wildcard
    8  issuerRef:
    9    name: cloudflare
    10    kind: ClusterIssuer
    11  commonName: "*.domain.com"
    12  dnsNames:
    13  - "*.domain.com"
    
  4. Создаем Ingress:

    1apiVersion: networking.k8s.io/v1
    2kind: Ingress
    3metadata:
    4  name: domain-wildcard
    5  namespace: app-namespace
    6spec:
    7  ingressClassName: nginx
    8  rules:
    9  - host: "*.domain.com"
    10    http:
    11      paths:
    12      - backend:
    13          service:
    14            name: svc-web
    15            port:
    16              number: 80
    17        path: /
    18  tls:
    19  - hosts:
    20    - "*.domain.com"
    21    secretName: tls-wildcard
    

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

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

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

      1{
      2    "Version": "2012-10-17",
      3    "Statement": [
      4        {
      5            "Effect": "Allow",
      6            "Action": "route53:GetChange",
      7            "Resource": "arn:aws:route53:::change/*"
      8        },
      9        {
      10            "Effect": "Allow",
      11            "Action": "route53:ChangeResourceRecordSets",
      12            "Resource": "arn:aws:route53:::hostedzone/*"
      13        },
      14        {
      15            "Effect": "Allow",
      16            "Action": "route53:ListHostedZonesByName",
      17            "Resource": "*"
      18        }
      19    ]
      20}
      
    • Заходим на страницу управления пользователями. Создаем пользователя с созданной ранее политикой.

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

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

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

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

    1apiVersion: cert-manager.io/v1
    2kind: Certificate
    3metadata:
    4  name: domain-wildcard
    5  namespace: app-namespace
    6spec:
    7  secretName: tls-wildcard
    8  issuerRef:
    9    name: route53
    10    kind: ClusterIssuer
    11  commonName: "*.domain.com"
    12  dnsNames:
    13  - "*.domain.com"
    

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

  1. Создаем ServiceAccount с необходимой ролью:

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

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

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

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

    1apiVersion: cert-manager.io/v1
    2kind: Certificate
    3metadata:
    4  name: domain-wildcard
    5  namespace: app-namespace
    6spec:
    7  secretName: tls-wildcard
    8  issuerRef:
    9    name: clouddns
    10    kind: ClusterIssuer
    11  dnsNames:
    12  - "*.domain.com"
    

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

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

1apiVersion: cert-manager.io/v1
2kind: Certificate
3metadata:
4  name: example-com                          # Имя сертификата, через него потом можно смотреть статус.
5  namespace: default
6spec:
7  secretName: example-com-tls                # Название Secret'а, в который положить приватный ключ и сертификат.
8  issuerRef:
9    kind: ClusterIssuer                      # Ссылка на "выдаватель" сертификатов, см. подробнее ниже.
10    name: selfsigned
11  commonName: example.com                    # Основной домен сертификата.
12  dnsNames:                                  # Дополнительные домены сертификата, указывать необязательно.
13  - www.example.com
14  - admin.example.com