Aws-cert-manager

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску


Для Ingress требуется автоматически выписывать сертефикаты для доменов которые "Хостятся" на нем

Предварительные требования

Требуется доступ (ручной или автоматический) к управлению зоной DNS для того что бы направить нужные домены на соответвующий Ingress

Возможные варианты решения

  • Использовать независимое от cloud-провайдера решение, Let's encrypt.
    • В завимсимости от того где лежит DNS-зона и как ей можно управлять, может требовать или не требовать ручной правкии зоны.
    • В случае если зона хостится на AWS Route53 возможно применить например такую автоматизацию обновления зоны
    • К плюсам можно отнести то что решение будет работать на любом клауде, не привязано к провайдеру.
    • Список возможных Issuers досаточно широк (https://cert-manager.io/docs/configuration/issuers/), для тестирования можно например использовать локально развернутый Hashicorp Vault


  • Использовать сертефикаты от AWS (это пока не реализовано)

cert-manager

Для решения этой задачи существует cert-manager
Примерный принцип работы (насколько я его понимаю)

  • Установка в том чимсле создания Custom Resource Definition (далее CRD)
  • Cоздается ресусурс типа Issuer или ClusterIssuer — описывает, откуда брать сертификаты
    • Разница в том что Issuer доступен только внутри namespace, в моем случае когда все сертефикаты нужны для нескольких копий приложения ("окружений"), например dev.domain.tld, staging.domain.tld, qa.domain.tld нужно будет изменить ClusterIssuer на Issuer. Пока окружение одно это не важно, но как только их несколько то не хочется иметь один сертефикат на всех с длинным списком Altnames (но это требует проверки)
  • После создания Certificate-ресурса — cert-manager следит за ним и выполняет выпуск согласно настройкам ресурса, результат сохраняет в Secret

cert-manager автоматически:

  • делает HTTP или DNS-проверку чтобы подтвердить владение доменом (в этом случае HTTP так как у него нет доступа к управлению ресурсами зоны!) Как именно определено в поле solvers
  • получает сертификат от CA, определенного в поле acme
  • сохраняет в Secret в namespace (в случае с ClusterIssuer это namespace где запущен сам cert-manager
  • Мониторит и продлевает его до истечения срока действия.


Установка

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm \
   install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true

Пример ClusterIssuer

Достаточно простой объект

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-http-cert-issuer
spec:
  acme:
    email: sirmax123@gmail.com
    privateKeySecretRef:
      name: letsencrypt-http
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - http01:
        ingress:
          class: nginx
  • имя можно выбрать произвольное
  • email: sirmax123@gmail.com раньше был нужен что б Let's Encrypt мог прислать оповещение, но он уже давно это отключил и сецчас это просто ненужное но обязательное поле.
  • solvers способ подтверждения владения доменом
  • имя серкрта куда сохранять сертефикат и ключ