DevOps et supervision

L'acquisition de certificats TLS à l'exécution en Go élimine les redémarrages

L'équipe Dushed détaille une approche basée sur Go pour acquérir et renouveler les certificats Let's Encrypt à l'exécution, évitant ainsi les outils externes et les redémarrages de service.

Baie de serveurs avec un bouclier vert et des horloges flottantes représentant la gestion des certificats à l'exécution
Illustration créée pour cet article

Traduit automatiquement depuis l’original en anglais.

Le 16 octobre 2026, les développeurs derrière Dushed, une application web de gestion des connaissances, ont publié une analyse technique approfondie sur la gestion directe des certificats Transport Layer Security (TLS) au sein de leur application Go. Au lieu de s'appuyer sur des outils d'automatisation externes, ils ont mis en œuvre un système qui acquiert et renouvelle les certificats auprès de Let's Encrypt pendant l'exécution, supprimant ainsi le besoin de redémarrer le processus après chaque renouvellement.

Ce qui s'est passé

Traditionnellement, les serveurs web obtiennent leurs certificats TLS via des outils hors bande comme Certbot ou d'autres clients ACME. Ces outils fonctionnent séparément du serveur web, nécessitant souvent des modifications de configuration et des redémarrages de service pour charger les nouveaux certificats. L'équipe Dushed a cherché à simplifier cette charge opérationnelle pour son application auto-hébergée, qui agrège notes, favoris, fichiers et flux dans une bibliothèque unique. Ils visaient à supprimer la dépendance aux processus de renouvellement externes qui les obligeaient autrement à redémarrer le service Dushed à chaque mise à jour d'un certificat.

Pour y parvenir, les développeurs ont exploité des fonctionnalités spécifiques de la bibliothèque standard Go. Dans une configuration typique de serveur HTTPS Go, la fonction ListenAndServeTLS attend des chemins de fichiers vers des certificats et clés existants. Cependant, la structure http.Server accepte également un champ optionnel TLSConfig. Cet objet de configuration inclut un champ de fonction GetCertificate, permettant au serveur de récupérer dynamiquement un certificat en fonction du message hello du client. En injectant une logique personnalisée dans cette fonction, l'application peut demander ou renouveler des certificats à la volée sans arrêter le serveur.

La mise en œuvre repose sur le package golang.org/x/crypto/acme/autocert plutôt que sur un client ACME personnalisé. Ce package gère la communication avec Let's Encrypt, y compris la vérification par défi-réponse nécessaire pour prouver la propriété du domaine. La fonction getCert vérifie la validité des certificats en mémoire ou sur disque et déclenche un renouvellement si nécessaire. Cette approche prend également en charge des fonctionnalités avancées telles que la sélection de certificats basée sur l'Indication du Nom du Serveur (SNI) et le renouvellement préventif avant expiration.

Détails clés

  • La solution est construite en utilisant le langage de programmation Go et la bibliothèque golang.org/x/crypto/acme/autocert.
  • L'acquisition et le renouvellement des certificats se font à l'exécution via le callback GetCertificate dans tls.Config.
  • Le système évite les outils externes comme Certbot, supprimant le besoin de processus de maintenance distincts.
  • Les certificats sont persistés à la fois sur disque et en mémoire pour garantir leur disponibilité entre les déploiements.
  • Les déploiements sans interruption de service sont pris en charge grâce à l'utilisation des options de socket SO_REUSEPORT et SO_REUSEADDR.
  • La méthode permet un service dynamique de certificats basé sur SNI et des stratégies de renouvellement proactives.

Contexte

TLS est le protocole qui chiffre les données entre le navigateur d'un utilisateur et un serveur web, assurant confidentialité et intégrité. Pour établir une connexion sécurisée, le serveur doit présenter un certificat numérique émis par une Autorité de Certification (CA) de confiance. Let's Encrypt est une CA largement utilisée qui fournit des certificats gratuits et automatisés via le protocole ACME. L'automatisation est cruciale car ces certificats expirent généralement tous les 90 jours.

Dans de nombreux environnements auto-hébergés, les administrateurs utilisent des outils comme Certbot pour gérer cette automatisation. Ces outils écrivent généralement de nouveaux fichiers de certificats sur le disque puis signalent au serveur web de recharger sa configuration. Bien qu'efficace, cela ajoute de la complexité au pipeline de déploiement et introduit une brève fenêtre où le service pourrait être indisponible ou mal configuré lors des redémarrages. Intégrer cette logique directement dans le code de l'application transfère la responsabilité du niveau système d'exploitation au niveau application, offrant un contrôle plus strict sur le cycle de vie des identifiants de sécurité.

Pourquoi c'est important

Pour les équipes exploitant des logiciels auto-hébergés, la réduction de la complexité opérationnelle est un objectif principal. Gérer des jobs cron séparés, des minuteurs systemd ou des sidecars de conteneurs pour le renouvellement des certificats ajoute des frictions à la gestion de l'infrastructure. En intégrant le client ACME directement dans l'application, les développeurs peuvent déployer un seul binaire ou conteneur qui gère son propre cycle de vie de sécurité. Cela réduit le risque de divergence de configuration entre les paramètres du serveur web et l'outil de renouvellement externe.

De plus, la capacité de renouveler les certificats sans redémarrer le service améliore la fiabilité. Dans les environnements à haute disponibilité, même de brefs redémarrages peuvent provoquer des coupures de connexion pour les utilisateurs actifs. La technique décrite par l'équipe Dushed garantit que le serveur reste réactif tout au long du processus de renouvellement. Elle simplifie également les déploiements sans interruption, car les nouveaux et anciens processus peuvent partager le même port et accéder aux mêmes certificats mis en cache pendant la période de transition.

Ce que vous pouvez faire

  • Évaluez si vos services basés sur Go peuvent bénéficier de clients ACME intégrés pour réduire les dépendances externes.
  • Examinez votre workflow actuel de renouvellement de certificats pour identifier les redémarrages de service ou les étapes manuelles inutiles.
  • Implémentez des callbacks GetCertificate dans vos serveurs Go pour permettre le chargement dynamique de certificats.
  • Utilisez SO_REUSEPORT et SO_REUSEADDR pour prendre en charge les rechargements gracieux et les déploiements sans interruption.
  • Assurez-vous que les certificats sont persistés sur disque ainsi qu'en mémoire pour survivre aux plantages ou redémarrages de l'application.
  • Surveillez indépendamment les dates d'expiration des certificats pour détecter les échecs dans la logique de renouvellement automatisée.

Autres actualités

Toutes les actualités