Créer un certificat Let's Encrypt avec un challenge DNS dans Kubernetes avec cert-manager

Afin de créer un certificat, le protocole ACME propose de vérifier votre domaine par l'échange d'une information secrète.

Par défaut, cet échange est fait par HTTP, mais il peut être fait par DNS, et DNS est imposé pour la création d'un certificat wildcard (certificat pour tous les sous domaines d'un domaine) ou pour créer un certificat pour un nom de domaine qui ne sera pas publié sur internet.

Pour utiliser le challenge DNS entre Let's Encrypt et les serveurs DNS de LeBureau.coop, vous devez obtenir une clef TSIG en la demandant à notre support.

Vous devrez commencer par définir le contenu de la clef dans un fichier tenu secret, que nous nommerons secret.yaml par souci de clarté :

apiVersion: v1
kind: Secret
metadata:
    name: example-com-tsig-key
    namespace: cert-manager
type: Opaque
stringData:
    secret: 4q4wM/2I180UXoMyN4INVhJNi8V9BCV+jMw2mXgZw/CSuxUT8C7NKKFs AmKd7ak51vWKgSl12ib86oQRPkpDjg==

Ensuite, il faut configurer cert-manager dans le fichier issuers.yaml :

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: cert-manager
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: <email_du_compte_lets_encrypt>
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - selector:
        dnsZones:
          - example.com
      dns01:
        rfc2136:
          # nameserver: 45.13.107.8:53
          nameserver: 78.196.218.87:53
          tsigKeyName: lebureau_coop_example_com.
          tsigAlgorithm: HMACSHA512
          tsigSecretSecretRef:
            name: example-com-tsig-key
            key: secret
    - http01:
        ingress:
          ingressClassName: traefik

Pour terminer, il faut appliquer cette configuration avec kubectl apply -f issuers.yaml