NOPE LinkedIn

Catégories:
PKI
SSL

Fonctionnement du protocole ACME

Fonctionnement du protocole ACME image

Guide de lecture
Cet article est la partie 1 de notre série “ACME”.
Pour une navigation aisée au sein de cet article, une table des matières est disponible sur le côté droit.

Une explication détaillée du fonctionnement du protocole ACME

Le protocole ACME (Automated Certificate Management Environment - Environnement de Gestion Automatisée de Certificats) est un protocole standard ouvert qui permet d’automatiser les interactions entre les autorités de certification (AC ou CA en anglais) et les serveurs web (ou tout autre client nécessitant un certificat). Son objectif principal est de rendre l’obtention, le renouvellement et la révocation des certificats X.509 (SSL/TLS) plus simples, plus rapides et plus fiables, éliminant ainsi une grande partie du travail manuel traditionnellement requis. Let’s Encrypt est l’exemple le plus connu d’autorité de certification utilisant ACME.

Pourquoi ACME ?

Avant ACME, l’obtention et le renouvellement de certificats SSL/TLS étaient souvent des processus manuels : génération d’une demande de signature de certificat (CSR), soumission à une AC, validation de la propriété du domaine (souvent par email ou en plaçant un fichier spécifique sur le serveur), et enfin installation du certificat. Ce processus était non seulement chronophage mais aussi source d’erreurs, pouvant conduire à des expirations de certificats et à des interruptions de service.

ACME vise à résoudre ces problèmes en automatisant chaque étape.

Les Acteurs du Protocole ACME

Deux acteurs principaux interagissent dans le protocole ACME :

1. Le Client ACME :

C’est un logiciel qui s’exécute sur le serveur (ou l’appareil) de l’utilisateur qui souhaite obtenir un certificat. Il communique avec le serveur ACME pour demander, renouveler ou révoquer des certificats.
Des exemples de clients ACME populaires incluent Certbot, acme.sh, et des intégrations natives dans des serveurs web comme Caddy.

2. Le Serveur ACME (Autorité de Certification) :

C’est le système exploité par l’autorité de certification (par exemple, Let’s Encrypt). Il répond aux requêtes du client ACME, vérifie la propriété du domaine et émet les certificats.

Fonctionnement Général du Protocole ACME

Le processus ACME se déroule en plusieurs étapes clés :

%%{init: {"flowchart":{'securityLevel': 'loose', 'theme':'base', 'markdownAutoWrap': 'false'}}}%% sequenceDiagram participant Client ACME participant Serveur ACME (CA) Client ACME->>Serveur ACME (CA): 1. Création de compte / Enregistrement de la clé publique Serveur ACME (CA)-->>Client ACME: Réponse (succès/échec) Client ACME->>Serveur ACME (CA): 2. Demande de certificat (commande) pour un ou plusieurs domaines Serveur ACME (CA)-->>Client ACME: 3. Défis de validation de domaine Client ACME->>Client ACME: 4. Préparation pour répondre aux défis Note right of Client ACME: (ex: création d'un fichier HTTP, enregistrement DNS) Client ACME->>Serveur ACME (CA): 5. Notification : Prêt pour la validation Serveur ACME (CA)->>Serveur du Domaine (via Internet): 6. Vérification du défi Note left of Serveur ACME (CA): (ex: requête HTTP, requête DNS) Serveur du Domaine (via Internet)-->>Serveur ACME (CA): Réponse au défi alt Validation Réussie Serveur ACME (CA)-->>Client ACME: 7. Statut de validation : Succès Client ACME->>Serveur ACME (CA): 8. Envoi de la Demande de Signature de Certificat (CSR) Note right of Client ACME: Le CSR contient la clé publique du certificat à émettre Serveur ACME (CA)-->>Client ACME: 9. Émission et envoi du certificat signé Client ACME->>Client ACME: 10. Installation du certificat else Validation Échouée Serveur ACME (CA)-->>Client ACME: Statut de validation : Échec end
Expliquons ces étapes plus en détail :

1. Création de Compte et Enregistrement

  • Avant de pouvoir demander des certificats, le client ACME doit s’enregistrer auprès du serveur ACME.
  • Le client génère une paire de clés (publique et privée) pour son compte.
  • Il envoie sa clé publique au serveur ACME.
  • Le serveur ACME crée un compte associé à cette clé publique.
    Toutes les communications ultérieures du client devront être signées avec la clé privée correspondante, prouvant ainsi son identité.

2. Demande de Certificat (Commande)

Une fois le compte créé, le client peut initier une “commande” pour un certificat. Cette commande spécifie les noms de domaine (identifiants) pour lesquels le certificat doit être émis (par exemple, exemple.com et www.exemple.com).

3. Défis de Validation de Domaine

C’est l’étape cruciale. Pour s’assurer que le client contrôle réellement les domaines pour lesquels il demande un certificat, le serveur ACME lui propose un ou plusieurs “défis” (challenges).
Le client doit prouver son contrôle en relevant l’un de ces défis pour chaque domaine listé dans la commande.

Il existe plusieurs types de défis, les plus courants étant :

  • HTTP-01 : Le client doit héberger un fichier spécifique (contenant un jeton fourni par le serveur ACME) à une URL bien définie sur le serveur HTTP du domaine concerné. Le serveur ACME tentera alors de récupérer ce fichier via une requête HTTP.
  • DNS-01 : Le client doit créer un enregistrement DNS spécifique (généralement un enregistrement TXT) contenant une valeur dérivée d’un jeton fourni par le serveur ACME. Le serveur ACME effectuera alors une requête DNS pour vérifier cet enregistrement.
  • TLS-ALPN-01 : Le client configure son serveur TLS pour qu’il présente un certificat TLS spécifique (auto-signé, contenant une extension spéciale avec le jeton) lorsqu’une connexion est initiée avec une indication ALPN (Application-Layer Protocol Negotiation) particulière. Le serveur ACME tentera d’établir une connexion TLS pour vérifier cela.

4. Préparation et Réponse aux Défis

Le client ACME choisit l’un des types de défis proposés et effectue les actions nécessaires pour le préparer.
Par exemple,

  • pour un défi HTTP-01, il crée le fichier requis sur son serveur web.
  • Pour un défi DNS-01, il interagit avec l’API de son fournisseur DNS pour créer l’enregistrement TXT.

5. Notification au Serveur ACME

Une fois le défi préparé, le client notifie le serveur ACME qu’il est prêt pour la validation.

6. Vérification du Défi par le Serveur ACME

Le serveur ACME tente de vérifier que le client a correctement configuré le défi.

  • Pour HTTP-01 : Il effectue une requête HTTP vers http://<domaine>/.well-known/acme-challenge/<jeton>.
  • Pour DNS-01 : Il interroge les serveurs DNS pour l’enregistrement TXT _acme-challenge.`.
  • Pour TLS-ALPN-01 : Il initie une connexion TLS sur le port 443 vers le domaine avec l’ALPN acme-tls/1.

7. Statut de Validation

Si le serveur ACME parvient à vérifier le défi, le domaine est considéré comme validé.

8. Envoi de la Demande de Signature de Certificat (CSR)

Après avoir validé tous les domaines de la commande, le client ACME génère une paire de clés pour le certificat lui-même (différente de la clé de compte). Il crée ensuite une Demande de Signature de Certificat (CSR). Le CSR contient la clé publique du certificat, les noms de domaine et d’autres informations. Le client signe ce CSR avec la clé privée du certificat et l’envoie au serveur ACME. La requête finale est également signée avec la clé privée du compte ACME.

9. Émission et Envoi du Certificat

Le serveur ACME vérifie la signature du CSR. S’il est valide et que tous les domaines sont autorisés, il signe le certificat avec sa propre clé privée (celle de l’AC) et le renvoie au client ACME. L’AC peut également renvoyer des certificats intermédiaires nécessaires pour former une chaîne de confiance complète.

10. Installation du Certificat

Le client ACME reçoit le certificat signé et la chaîne de certificats, puis les installe sur le serveur web ou l’application concernée.

Les Différents Types de Défis en Détail

Défi HTTP-01

Ce défi prouve que vous contrôlez le serveur web hébergeant le domaine.

%%{init: {"flowchart":{'securityLevel': 'loose', 'theme':'base', 'markdownAutoWrap': 'false'}}}%% graph TD client["Client ACME"] server["Serveur ACME (CA)"] subgraph sg_client_http [Client ACME] A[Génère un Jeton_Client] B{Crée un Fichier_Défi contenant Jeton_Serveur + Empreinte_Clé_Compte} C[Place Fichier_Défi sur http://domaine/.well-known/acme-challenge/Jeton_Serveur] end subgraph sg_server_http [Serveur ACME CA] D[Génère Jeton_Serveur] E{Requête HTTP GET vers http://domaine/.well-known/acme-challenge/Jeton_Serveur} F{"Vérifie le contenu du fichier (doit correspondre à Jeton_Serveur + Empreinte_Clé_Compte)"} end client -- Demande de validation HTTP-01 --> server server -- Envoie Jeton_Serveur --> client client -- Prépare le défi --> C client -- Notifie : prêt --> server server -- Vérification --> E E --> F F -- Si OK --> Validation_Réussie[Validation Réussie] F -- Si KO --> Validation_Échouée[Validation Échouée] style A fill:#bde0fe,stroke:#333,stroke-width:2px style B fill:#bde0fe,stroke:#333,stroke-width:2px style C fill:#bde0fe,stroke:#333,stroke-width:2px style D fill:#ccf,stroke:#333,stroke-width:2px style E fill:#ccf,stroke:#333,stroke-width:2px style F fill:#ccf,stroke:#333,stroke-width:2px style client fill:#ddd,stroke:#333,stroke-width:1px style server fill:#ddd,stroke:#333,stroke-width:1px

  • Avantages : Facile à automatiser pour les serveurs web standards. Ne nécessite pas d’accès à la configuration DNS.
  • Inconvénients : Nécessite que le serveur soit accessible sur le port 80 depuis Internet. Ne peut pas être utilisé pour les certificats wildcard (joker, par exemple *.exemple.com).

Défi DNS-01

Ce défi prouve que vous contrôlez la zone DNS du domaine.

%%{init: { "flowchart": { "securityLevel": "loose", "theme": "base", "markdownAutoWrap": false, "nodeSpacing": 30, // Espace horizontal entre les nœuds d'un même rang (défaut: 50) "rankSpacing": 40, // Espace vertical entre les rangs (défaut: 50) "themeVariables": { "fontSize": "12px", // Taille de police globale (défaut: 16px pour 'base') "primaryColor": "#f0f0f0", // Exemple de changement de couleur de fond des nœuds "primaryTextColor": "#333" // Exemple de changement de couleur du texte // Vous pouvez trouver d'autres variables de thème dans la documentation Mermaid } }, "sequence": { // Vous pouvez aussi ajouter des options pour les sequenceDiagram "securityLevel": "loose", "theme": "base", "messageFontFamily": "Arial, sans-serif", "messageFontSize": 12, // Taille de police pour les messages "actorFontSize": 13, // Taille de police pour les acteurs "noteFontSize": 11 // Taille de police pour les notes // Consultez la doc pour les options spécifiques aux diagrammes de séquence } } }%% graph TD client["Client ACME"] server["Serveur ACME (CA)"] subgraph sg_client_dns [Client ACME] A[Génère un Jeton_Client] B{Calcule Valeur_TXT à partir de Jeton_Serveur + Empreinte_Clé_Compte} C[Crée un enregistrement DNS TXT : _acme-challenge.domaine avec Valeur_TXT] end subgraph sg_server_dns ["Serveur ACME (CA)"] D[Génère Jeton_Serveur] E{Requête DNS pour l'enregistrement TXT _acme-challenge.domaine} F{Vérifie si la valeur de l'enregistrement TXT correspond à Valeur_TXT attendue} end client -- Demande de validation DNS-01 --> server server -- Envoie Jeton_Serveur --> client client -- Prépare le défi --> C client -- Notifie : prêt --> server server -- Vérification (après propagation DNS) --> E E --> F F -- Si OK --> Validation_Réussie[Validation Réussie] F -- Si KO --> Validation_Échouée[Validation Échouée] style A fill:#bde0fe,stroke:#333,stroke-width:2px style B fill:#bde0fe,stroke:#333,stroke-width:2px style C fill:#bde0fe,stroke:#333,stroke-width:2px style D fill:#ccf,stroke:#333,stroke-width:2px style E fill:#ccf,stroke:#333,stroke-width:2px style F fill:#ccf,stroke:#333,stroke-width:2px style client fill:#ddd,stroke:#333,stroke-width:1px style server fill:#ddd,stroke:#333,stroke-width:1px

  • Avantages : Permet d’obtenir des certificats wildcard. Ne nécessite pas que le serveur soit directement accessible depuis Internet (utile pour les serveurs en réseau privé).
  • Inconvénients : Nécessite un accès programmatique à la configuration DNS du domaine, ce qui peut être plus complexe à mettre en place. La propagation DNS peut introduire des délais.

Défi TLS-ALPN-01

Ce défi utilise l’extension ALPN (Application-Layer Protocol Negotiation) de TLS.

%%{init: {"flowchart":{'securityLevel': 'loose', 'theme':'base', 'markdownAutoWrap': 'false'}}}%% graph TD client["Client ACME"] server["Serveur ACME (CA)"] subgraph sg_client_tls [Client ACME] A[Génère un Jeton_Client] B{Crée un certificat TLS auto-signé temporaire contenant une extension X.509 spécifique avec Jeton_Serveur} C["Configure le serveur TLS pour utiliser ce certificat temporaire pour les connexions avec ALPN acme-tls/1"] end subgraph sg_server_tls ["Serveur ACME (CA)"] D[Génère Jeton_Serveur] E{"Initie une connexion TLS vers domaine:443 avec l'ALPN acme-tls/1"} F{Vérifie si le certificat présenté par le serveur contient l'extension attendue avec Jeton_Serveur} end client -- Demande de validation TLS-ALPN-01 --> server server -- Envoie Jeton_Serveur --> client client -- Prépare le défi --> C client -- Notifie : prêt --> server server -- Vérification --> E E --> F F -- Si OK --> Validation_Réussie[Validation Réussie] F -- Si KO --> Validation_Échouée[Validation Échouée] style A fill:#bde0fe,stroke:#333,stroke-width:2px style B fill:#bde0fe,stroke:#333,stroke-width:2px style C fill:#bde0fe,stroke:#333,stroke-width:2px style D fill:#ccf,stroke:#333,stroke-width:2px style E fill:#ccf,stroke:#333,stroke-width:2px style F fill:#ccf,stroke:#333,stroke-width:2px style client fill:#ddd,stroke:#333,stroke-width:1px style server fill:#ddd,stroke:#333,stroke-width:1px

  • Avantages : Peut être utilisé si le port 80 n’est pas disponible. La validation se fait au niveau TLS.
  • Inconvénients : Nécessite un contrôle sur la configuration TLS du serveur. N’est pas aussi largement supporté ou utilisé que HTTP-01 ou DNS-01. Ne peut pas être utilisé pour les certificats wildcard.

Renouvellement et Révocation

Renouvellement

Les certificats émis via ACME ont généralement une durée de vie courte (par exemple, 90 jours pour Let’s Encrypt). C’est une bonne pratique de sécurité, car cela limite la fenêtre d’exposition en cas de compromission d’une clé privée. Le protocole ACME est conçu pour automatiser également le renouvellement. Le client ACME peut être configuré pour vérifier régulièrement la date d’expiration des certificats et initier automatiquement le processus de renouvellement (qui suit les mêmes étapes que la demande initiale) bien avant l’expiration.

Révocation

Si la clé privée d’un certificat est compromise, ou si le certificat n’est plus nécessaire, il doit être révoqué. Le client ACME peut envoyer une requête de révocation signée au serveur ACME. Pour révoquer un certificat, le client doit prouver qu’il est autorisé à le faire, soit en signant la requête avec la clé privée du compte ACME qui a demandé le certificat, soit avec la clé privée du certificat lui-même.

Conclusion

Le protocole ACME a révolutionné la manière dont les certificats SSL/TLS sont gérés, en rendant l’ensemble du cycle de vie (émission, renouvellement, révocation) automatisable. Il a grandement contribué à l’adoption généralisée du HTTPS en abaissant les barrières techniques et financières. Grâce à ACME, sécuriser un site web avec HTTPS est devenu accessible à tous, de manière simple et standardisée. Comprendre son fonctionnement permet de mieux appréhender les mécanismes qui assurent la confiance et la sécurité sur le Web moderne.