Le protocole ACME (Automatic Certificate Management Environment) automatise l'obtention et le renouvellement des certificats numériques X.509. Grâce à ce protocole, une autorité de certification (CA) peut vérifier automatiquement que le demandeur est bien le propriétaire d'un domaine avant de délivrer un certificat. Let's Encrypt est une autorité de certification publique à but non lucratif qui prend en charge le protocole ACME et émet des certificats approuvés par la plupart des navigateurs web. Cette rubrique explique comment utiliser cert-manager avec Let's Encrypt pour obtenir un certificat HTTPS de confiance pour une passerelle d'entrée Service Mesh (ASM).
Prérequis
Un cluster Container Service for Kubernetes (ACK) ajouté à une instance ASM version 1.16 ou ultérieure. Pour plus d'informations, consultez les rubriques Ajouter un cluster à une instance ASM et Mettre à niveau une instance ASM.
Une passerelle d'entrée déployée avec les ports 80 et 443 exposés. Pour plus d'informations, consultez la rubrique Créer une passerelle d'entrée.
L'application httpbin déployée dans le cluster associé à l'instance ASM. Pour plus d'informations, consultez la rubrique Déployer l'application httpbin.
cert-manager installé. Pour plus d'informations, consultez la rubrique Installer cert-manager dans un cluster.
La prise en charge de l'API Ingress activée sur la passerelle ASM. Pour plus d'informations, consultez l'étape Étape 1 : Activer l'accès à l'API Ingress.
Fonctionnement d'ACME dans cert-manager
Lorsque vous utilisez cert-manager, le composant ACME Issuer enregistre des comptes utilisateur auprès des serveurs d'autorité de certification (CA) compatibles avec le protocole ACME. Lors de la création d'un ACME Issuer, cert-manager génère une clé privée permettant une communication sécurisée avec le serveur CA ACME. Les certificats émis par des autorités publiques telles que Let's Encrypt sont généralement reconnus par la majorité des navigateurs web, ce qui permet aux utilisateurs d'accéder à votre site sans avertissements de sécurité. Le rôle principal d'une autorité de certification publique consiste à prouver au navigateur que le serveur est bien le propriétaire légitime du domaine. Pour ce faire, l'autorité doit vérifier que le demandeur contrôle le domaine avant de délivrer le certificat. Pour plus de détails sur le protocole ACME, consultez la RFC Automatic Certificate Management Environment.
Défis (Challenges)
Un défi constitue un mécanisme clé du protocole ACME utilisé pour vérifier la propriété d'un domaine par le demandeur de certificat. Au cours du processus de demande, le serveur CA ACME impose au client (le demandeur) de relever un défi spécifique. Cette procédure garantit que seul le propriétaire légitime du domaine peut obtenir un certificat, renforçant ainsi la sécurité et empêchant l'usurpation de domaine. cert-manager prend en charge deux types principaux de défis : le défi HTTP-01 et le défi DNS-01.
Le défi HTTP-01 exige que le serveur expose une clé de validation via une URL HTTP spécifique accessible publiquement. Cette URL utilise le domaine pour lequel le certificat est demandé. Lorsque le serveur CA ACME récupère cette clé avec succès, il considère que le demandeur contrôle le domaine. Pour simplifier cette opération, cert-manager modifie automatiquement la ressource Ingress du cluster lorsqu'un défi HTTP-01 est configuré. Il redirige les requêtes vers l'URL de validation vers un service web temporaire contenant la clé requise et répondant au défi du serveur ACME.
Le défi DNS-01 fonctionne en publiant une clé spécifique sous forme d'enregistrement TXT dans le système DNS. Après la propagation de cet enregistrement TXT, le serveur CA ACME peut récupérer la clé via une requête DNS standard afin de confirmer la propriété du domaine. Avec les autorisations appropriées, cert-manager crée et soumet automatiquement l'enregistrement TXT requis auprès de votre fournisseur DNS pour satisfaire au défi DNS-01.
Dans un environnement de production, vous devez vérifier si votre autorité de certification (CA) prend en charge le protocole ACME. Si tel est le cas, la passerelle d'entrée ASM peut obtenir automatiquement des certificats auprès de l'autorité via cert-manager. Par exemple, Sectigo prend en charge le protocole ACME et son processus est similaire à celui décrit dans cette rubrique.
Étape 1 : Préparer un domaine public
Pour utiliser Let's Encrypt afin de délivrer un certificat, vous devez disposer d'un domaine public. Vous devez également pointer ce domaine vers la passerelle d'entrée ASM que vous comptez utiliser. Reportez-vous à la documentation de votre fournisseur DNS pour les instructions spécifiques. Si vous utilisez Alibaba Cloud DNS, consultez la rubrique Ajouter un enregistrement DNS. Pour plus d'informations sur Let's Encrypt, consultez le guide Getting Started.
Étape 2 : Créer un émetteur (Issuer) pour Let's Encrypt
-
Utilisez le fichier KubeConfig de votre cluster de plan de données pour créer la ressource suivante.
apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-prod-issuer namespace: istio-system spec: acme: email: 'your-email@example.com' # This field is optional but recommended. The ACME server may use this email to send you important notices about your certificate. privateKeySecretRef: name: letsencrypt-prod server: https://acme-v02.api.letsencrypt.org/directory solvers: - http01: ingress: ingressClassName: istioLa ressource Issuer ci-dessus spécifie un solveur
http01, qui utilise l'API Ingress avec un paramètreingressClassNamedéfini suristio.Remarquecert-manager prend en charge des solveurs pour l'API Ingress et l'API Gateway. ASM prend également en charge ces deux API. Cet exemple utilise l'API Ingress.
-
Attendez que l'émetteur (Issuer) soit prêt. Exécutez la commande suivante pour vérifier son état.
kubectl -n istio-system get issuer letsencrypt-prod-issuerRésultat attendu :
NAME READY AGE letsencrypt-prod-issuer True 8m3s
Étape 3 : Délivrer un certificat pour la passerelle ASM
-
Utilisez le fichier KubeConfig de votre cluster de plan de données pour créer la ressource suivante.
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: istio-ingressgateway-certs namespace: istio-system spec: dnsNames: - ${YOUR_DOMAIN} # test.com issuerRef: group: cert-manager.io kind: Issuer name: letsencrypt-prod-issuer secretName: istio-ingressgateway-certs -
Attendez que le certificat soit prêt. Exécutez la commande suivante pour vérifier son état.
kubectl -n istio-system get certificate istio-ingressgateway-certsRésultat attendu :
NAME READY SECRET AGE istio-ingressgateway-certs True istio-ingressgateway-certs 59m
Fonctionnement de la délivrance des certificats
Après la création de la ressource Certificate, cert-manager utilise l'émetteur (Issuer) spécifié pour délivrer un certificat pour le domaine. Durant ce processus, le solveur configuré devient actif.
Let's Encrypt utilise un défi HTTP-01 pour confirmer que le serveur possède le domaine. Il envoie une requête HTTP au domaine et doit recevoir une réponse valide pour achever la vérification. Dans cet exemple, la passerelle d'entrée ne dispose que de règles de routage pour l'application httpbin, sans configuration explicite pour le défi. Let's Encrypt a-t-il réellement envoyé une requête de défi ? Et comment la passerelle y a-t-elle répondu ?
Exécutez la commande suivante pour consulter les journaux de la passerelle et déterminer si Let's Encrypt a envoyé une requête de défi.
kubectl -n istio-system logs ${GATEWAY_POD_NAME} | grep letsencrypt | tail -1
Les journaux indiquent que la passerelle a reçu et traité avec succès une requête provenant de Let's Encrypt. Étant donné que l'émetteur (Issuer) est configuré avec un paramètre ingressClassName défini sur istio, cert-manager crée automatiquement une ressource Ingress avec le même ingressClassName. Cette ressource transfère la requête de défi vers le solveur cert-manager correspondant, qui effectue la vérification.
Vous ne verrez pas cette ressource Ingress si vous exécutez kubectl -n istio-system get ingress une fois le certificat prêt. En effet, cert-manager nettoie automatiquement les ressources liées au solveur, telles que les ressources Ingress, Service et Deployment, dès que le certificat est délivré avec succès.
Étape 4 : Vérifier le certificat
-
Créez la règle de passerelle suivante pour appliquer le certificat généré à l'étape Étape 3 sur le port 443 de la passerelle. Pour plus d'informations, consultez la rubrique Gérer les règles de passerelle.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-https namespace: default spec: selector: istio: ingressgateway servers: - hosts: - ${YOUR_DOMAIN} port: name: https number: 443 protocol: HTTPS tls: credentialName: istio-ingressgateway-certs mode: SIMPLE -
Mettez à jour le service virtuel httpbin-vs existant avec le contenu suivant. Pour plus d'informations, consultez la rubrique Gérer les services virtuels.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin-vs namespace: default spec: gateways: - httpbin - httpbin-https # Add this line. hosts: - '*' http: - name: test route: - destination: host: httpbin.default.svc.cluster.local port: number: 8000 -
Accédez à
https://${YOUR_DOMAIN}depuis votre navigateur web.La barre d'adresse du navigateur affiche une icône de cadenas. Cliquez sur l'icône (
). Le message Connection is secure s'affiche. Cela indique que le navigateur fait confiance à votre certificat.