8.4. Gestion des certificats avec un émetteur ACME
L'opérateur cert-manager pour Red Hat OpenShift prend en charge l'utilisation de serveurs ACME CA, tels que Let's Encrypt, pour émettre des certificats.
8.4.1. À propos des émetteurs de l'ACME
Le type d'émetteur ACME pour l'opérateur cert-manager de Red Hat OpenShift représente un serveur d'autorité de certification (CA) ACME (Automated Certificate Management Environment). Les serveurs ACME CA s'appuient sur challenge pour vérifier qu'un client possède les noms de domaine pour lesquels le certificat est demandé. Si le défi est réussi, le cert-manager Operator pour Red Hat OpenShift peut émettre le certificat. Si le défi échoue, l'opérateur de cert-manager pour Red Hat OpenShift n'émet pas le certificat.
8.4.1.1. Types de défis ACME pris en charge
L'opérateur cert-manager pour Red Hat OpenShift prend en charge les types de défis suivants pour les émetteurs ACME :
- HTTP-01
Avec le type de défi HTTP-01, vous fournissez une clé calculée à un point d'extrémité HTTP URL dans votre domaine. Si le serveur ACME CA peut obtenir la clé à partir de l'URL, il peut vous valider en tant que propriétaire du domaine.
Pour plus d'informations, voir HTTP01 dans la documentation de cert-manager en amont.
- DNS-01
Avec le type de défi DNS-01, vous fournissez une clé calculée dans un enregistrement DNS TXT. Si le serveur de l'ACME CA peut obtenir la clé par consultation DNS, il peut vous valider en tant que propriétaire du domaine.
Pour plus d'informations, voir DNS01 dans la documentation de cert-manager en amont.
8.4.1.2. Fournisseurs DNS-01 pris en charge
L'opérateur cert-manager pour Red Hat OpenShift prend en charge les fournisseurs DNS-01 suivants pour les émetteurs ACME :
- Amazon Route 53
Azure DNS
NoteL'opérateur cert-manager pour Red Hat OpenShift ne prend pas en charge l'utilisation des identités de pods Azure Active Directory (Azure AD) pour attribuer une identité gérée à un pod.
Google Cloud DNS
NoteL'opérateur cert-manager pour Red Hat OpenShift ne prend pas en charge l'utilisation de la fédération d'identité de la charge de travail de Google.
8.4.2. Configuration d'un émetteur ACME pour résoudre les problèmes HTTP-01
Vous pouvez utiliser cert-manager Operator pour Red Hat OpenShift pour configurer un émetteur ACME afin de résoudre les défis HTTP-01. Cette procédure utilise Let's Encrypt comme serveur ACME.
Conditions préalables
-
Vous avez accès au cluster en tant qu'utilisateur ayant le rôle
cluster-admin
. -
Vous avez un service que vous voulez exposer. Dans cette procédure, le service est nommé
sample-workload
.
Procédure
Créer un émetteur de cluster ACME.
Créer un fichier YAML qui définit l'objet
ClusterIssuer
:Exemple de fichier
acme-cluster-issuer.yaml
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging 1 spec: acme: preferredChain: "" privateKeySecretRef: name: <secret_for_private_key> 2 server: https://acme-staging-v02.api.letsencrypt.org/directory 3 solvers: - http01: ingress: class: openshift-default 4
- 1
- Indiquez le nom de l'émetteur du cluster.
- 2
- Remplacez
<secret_private_key>
par le nom du secret dans lequel vous souhaitez stocker la clé privée du compte ACME. - 3
- Indiquez l'URL permettant d'accéder au point de terminaison
directory
du serveur ACME. Cet exemple utilise l'environnement de préparation de Let's Encrypt. - 4
- Spécifiez la classe d'entrée.
Créez l'objet
ClusterIssuer
en exécutant la commande suivante :$ oc create -f acme-cluster-issuer.yaml
Créer une entrée pour exposer le service de la charge de travail de l'utilisateur.
Créer un fichier YAML qui définit un objet
Namespace
:Exemple de fichier
namespace.yaml
apiVersion: v1 kind: Namespace metadata: name: my-ingress-namespace 1
- 1
- Spécifiez l'espace de noms pour l'entrée.
Créez l'objet
Namespace
en exécutant la commande suivante :$ oc create -f namespace.yaml
Créer un fichier YAML qui définit l'objet
Ingress
:Exemple de fichier
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: sample-ingress 1 namespace: my-ingress-namespace 2 annotations: cert-manager.io/cluster-issuer: letsencrypt-staging 3 acme.cert-manager.io/http01-ingress-class: openshift-default 4 spec: ingressClassName: openshift-default 5 tls: - hosts: - <hostname> 6 secretName: sample-tls 7 rules: - host: <hostname> 8 http: paths: - path: / pathType: Prefix backend: service: name: sample-workload 9 port: number: 80
- 1
- Spécifiez le nom de l'entrée.
- 2
- Spécifiez l'espace de noms que vous avez créé pour l'Ingress.
- 3
- Indiquez l'émetteur de cluster que vous avez créé.
- 4
- Spécifiez la classe d'entrée.
- 5
- Spécifiez la classe d'entrée.
- 6
- Remplacez
<hostname>
par le Subject Alternative Name à associer au certificat. Ce nom est utilisé pour ajouter des noms DNS au certificat. - 7
- Indiquez le secret dans lequel le certificat créé doit être stocké.
- 8
- Remplacez
<hostname>
par le nom d'hôte. Vous pouvez utiliser la syntaxe<host_name>.<cluster_ingress_domain>
pour tirer parti de l'enregistrement DNS générique*.<cluster_ingress_domain>
et du certificat de service pour le cluster. Par exemple, vous pouvez utiliserapps.<cluster_base_domain>
. Sinon, vous devez vous assurer qu'un enregistrement DNS existe pour le nom d'hôte choisi. - 9
- Spécifiez le nom du service à exposer. Cet exemple utilise un service nommé
sample-workload
.
Créez l'objet
Ingress
en exécutant la commande suivante :$ oc create -f ingress.yaml
8.4.3. Configuration d'un émetteur ACME pour résoudre les problèmes liés au DNS-01
Vous pouvez utiliser cert-manager Operator pour Red Hat OpenShift pour configurer un émetteur ACME afin de résoudre les défis DNS-01. Cette procédure utilise Let’s Encrypt comme serveur ACME CA et montre comment résoudre les défis DNS-01 avec Amazon Route 53.
Les zones DNS privées ne sont pas prises en charge.
Conditions préalables
-
Vous avez accès au cluster OpenShift Container Platform en tant qu'utilisateur ayant le rôle
cluster-admin
. Vous avez configuré un rôle IAM pour Amazon Route 53. Pour plus d'informations, voir Route53 dans la documentation de cert-manager en amont.
NoteSi votre cluster est configuré à l'adresse not pour utiliser le service de jetons de sécurité AWS (STS), vous devez fournir des informations d'identification explicites pour
accessKeyID
etsecretAccessKey
. Si votre cluster utilise AWS STS, vous pouvez utiliser des informations d'identification ambiantes implicites.
Procédure
Facultatif : Remplacer les paramètres du serveur de noms pour l'autocontrôle DNS-01 :
Cette étape n'est nécessaire que si la zone cible hébergée publiquement chevauche la zone hébergée privée par défaut du cluster.
Modifiez la ressource
CertManager
en exécutant la commande suivante :$ oc edit certmanager cluster
Ajoutez une section
spec.controllerConfig
avec les arguments de substitution suivants :apiVersion: operator.openshift.io/v1alpha1 kind: CertManager metadata: name: cluster ... spec: ... controllerConfig: 1 overrideArgs: - '--dns01-recursive-nameservers=1.1.1.1:53' 2 - '--dns01-recursive-nameservers-only' 3
- 1
- Ajouter la section
spec.controllerConfig
. - 2
- Fournir une liste de serveurs de noms
<host>:<port>
séparés par des virgules à interroger pour l'auto-vérification DNS-01. - 3
- Indiquer d'utiliser uniquement les serveurs de noms récursifs au lieu de vérifier les serveurs de noms faisant autorité associés à ce domaine.
- Enregistrez le fichier pour appliquer les modifications.
Facultatif : Créez un espace de noms pour l'émetteur.
Créer un fichier YAML qui définit un objet
Namespace
:Exemple de fichier
namespace.yaml
apiVersion: v1 kind: Namespace metadata: name: my-issuer-namespace 1
- 1
- Indiquer l'espace de noms de l'émetteur.
Créez l'objet
Namespace
en exécutant la commande suivante :$ oc create -f namespace.yaml
Créez un secret dans lequel vous stockerez vos informations d'identification AWS en exécutant la commande suivante :
$ oc create secret generic aws-secret --from-literal=awsSecretAccessKey=<aws_secret_access_key> \ 1 -n my-issuer-namespace
- 1
- Remplacez
<aws_secret_access_key>
par votre clé d'accès secrète AWS.
Créer un émetteur.
Créer un fichier YAML qui définit l'objet
Issuer
:Exemple de fichier
issuer.yaml
apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-staging 1 namespace: my-issuer-namespace 2 spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory 3 email: "<email_address>" 4 privateKeySecretRef: name: <secret_private_key> 5 solvers: - dns01: route53: accessKeyID: <aws_key_id> 6 hostedZoneID: <hosted_zone_id> 7 region: us-east-1 secretAccessKeySecretRef: name: "aws-secret" 8 key: "awsSecretAccessKey" 9
- 1
- Indiquez le nom de l'émetteur.
- 2
- Indiquez l'espace de noms que vous avez créé pour l'émetteur.
- 3
- Indiquez l'URL permettant d'accéder au point de terminaison
directory
du serveur ACME. Cet exemple utilise l'environnement de préparation Let’s Encrypt. - 4
- Remplacez
<email_address>
par votre adresse électronique. - 5
- Remplacez
<secret_private_key>
par le nom du secret dans lequel stocker la clé privée du compte ACME. - 6
- Remplacez
<aws_key_id>
par votre ID de clé AWS. - 7
- Remplacez
<hosted_zone_id>
par l'ID de votre zone hébergée. - 8
- Indiquez le nom du secret que vous avez créé.
- 9
- Indiquez la clé dans le secret que vous avez créé et qui stocke votre clé d'accès au secret AWS.
Créez l'objet
Issuer
en exécutant la commande suivante :$ oc create -f issuer.yaml
Créer un certificat.
Créer un fichier YAML qui définit l'objet
Certificate
:Exemple de fichier
certificate.yaml
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: my-tls-cert 1 namespace: my-issuer-namespace 2 spec: isCA: false commonName: '<common_name>' 3 secretName: my-tls-cert 4 dnsNames: - '<domain_name>' 5 issuerRef: name: letsencrypt-staging 6 kind: Issuer
- 1
- Indiquez un nom pour le certificat.
- 2
- Indiquez l'espace de noms que vous avez créé pour l'émetteur.
- 3
- Remplacez
<common_name>
par votre nom commun (CN). - 4
- Indiquez le nom du secret à créer qui contiendra le certificat.
- 5
- Remplacez
<domain_name>
par votre nom de domaine. - 6
- Indiquez le nom de l'émetteur que vous avez créé.
Créez l'objet
Certificate
en exécutant la commande suivante :$ oc create -f certificate.yaml