Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

Publier en HTTPS avec HAProxy 3.4 : crt-store, SNI et certificats ACME intégrés

Par mis à jour le

Améliorer cette page

Avec HAProxy, un frontend qui écoute en HTTPS présente un certificat choisi par le nom demandé (SNI), déchiffre la requête et l'envoie en clair à un backend ; depuis la version 3.2, un client ACME intégré peut obtenir et renouveler ce certificat sans outil externe, mais il reste expérimental en 3.4. Cette leçon est le module facultatif HAProxy de la formation : elle traite la publication en HTTPS, et laisse la répartition de charge à la leçon Linux consacrée à HAProxy.

La leçon suit le chemin d'une connexion chiffrée, puis celui du certificat qui la rend possible.

  • Terminer le TLS dans un frontend et rediriger HTTP vers HTTPS.
  • Comprendre le choix du certificat par SNI.
  • Décrire les sections acme et crt-store.
  • Mesurer ce que signifie « expérimental » pour le client ACME.
  • Vérifier un renouvellement et un rechargement sans coupure.

Cette leçon suppose que vous connaissez les bases de HAProxy et ce qu'est un certificat ACME.

Le frontend déclare un bind avec ssl, puis une règle redirige le port 80 vers HTTPS. HAProxy déchiffre la connexion, applique ses règles sur la requête en clair, puis la transmet au backend. Un en-tête X-Forwarded-Proto dit à l'application que le client est arrivé en HTTPS.

frontend https_in
bind :80
bind :443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
http-request redirect scheme https unless { ssl_fc }
http-request set-header X-Forwarded-Proto https if { ssl_fc }
default_backend app

Quand crt désigne un dossier, HAProxy charge tous les certificats qu'il contient. Pour chaque connexion, il compare le nom annoncé par le client (SNI) aux noms des certificats et présente le bon ; si rien ne correspond, il présente un certificat par défaut. C'est le même mécanisme que celui de Traefik, décrit dans la leçon sur le trajet d'une requête.

La section crt-store regroupe les certificats et leurs clés dans un emplacement nommé, et la section acme décrit l'autorité qui les délivre. Un certificat du magasin se lie à une autorité par le mot-clé acme, et le frontend le référence par son nom plutôt que par un chemin de fichier.

global
expose-experimental-directives
acme pebble
directory https://pebble.lab.test:14000/dir
contact admin@lab.test
account-key /etc/haproxy/acme/account.key
challenge http-01
crt-store certs
crt-base /etc/haproxy/certs
key-base /etc/haproxy/certs
load crt "app.lab.test.pem" acme pebble domains "app.lab.test"
frontend https_in
bind :443 ssl alpn h2,http/1.1
ssl-f-use crt "@certs/app.lab.test"

Ce fichier illustre la structure, pas une solution prête à l'emploi : l'adresse de l'autorité, les chemins et les noms sont à adapter. Le principe à retenir est que le certificat est demandé et renouvelé par HAProxy lui-même, et que le frontend le lit dans le magasin. Si le certificat n'existe pas encore au démarrage, HAProxy peut en présenter un provisoire le temps d'obtenir le vrai.

Les certificats obtenus par ce client ne sont pas écrits sur le disque. HAProxy évite d'accéder au système de fichiers après le chargement de sa configuration : le certificat et sa clé vivent en mémoire, dans le magasin. La conséquence surprend au premier renouvellement, car le fichier attendu dans le répertoire du magasin n'apparaît jamais, et une sauvegarde qui copie ce répertoire ne sauvegarde rien. Pour en obtenir une copie, il faut la demander au processus, par la commande dump ssl cert sur le socket d'administration, ou par l'utilitaire haproxy-dump-certs que le paquet Debian fournit.

La clé du compte ACME prouve votre identité auprès de l'autorité : elle doit être lisible par HAProxy seul. Quiconque la possède peut demander des certificats au nom du compte. Placez-la dans un dossier dédié, avec des droits restreints au compte qui exécute HAProxy, hors de tout dépôt versionné.

Le même principe vaut pour les clés privées des certificats du magasin : un fichier lisible par tous annule l'intérêt du chiffrement. Après une configuration, listez les droits des fichiers et vérifiez que seuls le propriétaire et, au besoin, son groupe y accèdent.

Rechargez HAProxy plutôt que de le redémarrer : le processus maître lance de nouveaux processus de travail avec la nouvelle configuration, et les anciens terminent leurs connexions en cours. Avec le service systemd, la commande de rechargement fait cet enchaînement, après que haproxy -c -f a validé la configuration.

Fenêtre de terminal
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl reload haproxy

Pour prouver qu'un certificat renouvelé est servi sans interrompre le processus, comparez deux choses avant et après le renouvellement : le numéro de série ou la date de fin du certificat présenté (openssl s_client, avec le nom demandé en SNI), et l'identifiant du processus maître, qui doit rester le même. Un certificat qui change et un processus qui ne change pas prouvent le renouvellement à chaud.

Le lab part d'une petite application qui écoute sur l'hôte et d'un déploiement HAProxy qui ne la publie pas correctement en HTTPS. L'autorité ACME de test et son répondeur de défi HTTP-01 sont déjà préparés. Il vous demande de router app.lab.test vers le backend local, de rediriger HTTP vers HTTPS, d'obtenir le certificat avec le client ACME natif, de protéger la clé du compte et de prouver qu'un certificat renouvelé est servi sans interrompre le processus.

HAProxy sert le HTTPS par un frontend, un magasin de certificats et, au choix, son client ACME.

  • Le SNI choisit le certificat présenté.
  • crt-store regroupe les certificats, acme décrit l'autorité.
  • Le client ACME est expérimental : expose-experimental-directives est exigé.
  • La clé du compte ACME reste lisible par HAProxy seul.
  • Les certificats restent en mémoire : dump ssl cert ou haproxy-dump-certs en sort une copie.
  • reload après haproxy -c remplace les processus sans couper les connexions.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

8 questions
8 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn