Rotation des certificats SSL/TLS sans redémarrage dans NGINX Open Source

NGINX | 26 septembre 2023

Dans le monde des serveurs web hautes performances, NGINX est un choix populaire, car son architecture légère et efficace lui permet de gérer d’importants volumes de trafic. Avec l’introduction de la fonction de dictionnaire partagé dans le cadre du module JavaScript NGINX (njs), les performances de NGINX franchissent un nouveau cap.

Dans cet article de blog, nous explorons les fonctionnalités et les avantages du dictionnaire partagé de njs, et expliquons comment configurer NGINX Open Source sans avoir à le redémarrer lors du renouvellement des certificats SSL/TLS.

Principes de base et avantages du dictionnaire partagé

La nouvelle directive « js_shared_dict_zone » permet aux utilisateurs de NGINX Open Source d’activer des zones de mémoire partagée afin d’échanger efficacement des données entre les processus de travail. Ces zones de mémoire partagée font office de dictionnaires clé-valeur et stockent des paramètres de configuration dynamiques qui peuvent être consultés et modifiés en temps réel.

Les principaux avantages du dictionnaire partagé sont les suivants :

  • Faible surcharge et simplicité d’utilisation – Directement intégré à njs, il est facile à configurer et à utiliser grâce à une API intuitive et à une mise en œuvre simple. Il permet également de simplifier la gestion et le partage des données entre les processus de travail.
  • Léger et efficace – S’intègre parfaitement à NGINX en tirant parti de son modèle d’E/S non bloquantes et piloté par les événements. Cette approche réduit l’utilisation de la mémoire et améliore la gestion des accès simultanés, permettant ainsi à NGINX de traiter efficacement un grand nombre de connexions simultanées.
  • Évolutivité – Exploite la capacité de NGINX à évoluer horizontalement sur plusieurs processus de travail, afin de vous permettre de partager et de synchroniser les données entre ces processus sans recourir à des mécanismes complexes de communication interprocessus. Le paramètre de durée de vie (TTL) vous permet de gérer les enregistrements du dictionnaire partagé en les supprimant de la zone en cas d’inactivité. Le paramètre evict supprime la paire clé-valeur la plus ancienne afin de libérer de l’espace pour de nouvelles entrées.

Rotation SSL avec le dictionnaire partagé

L’un des cas d’usage les plus intéressants du dictionnaire partagé est la rotation des certificats SSL/TLS. Lorsque vous utilisez « js_shared_dict_zone », il n’est pas nécessaire de redémarrer NGINX en cas de mise à jour d’un certificat ou d’une clé SSL/TLS. De plus, vous disposez ainsi d’une API de type REST pour gérer les certificats sur NGINX.

Voici un exemple de fichier de configuration NGINX qui configure le serveur HTTPS à l’aide des directives « js_set » et « ssl_certificate ». Les gestionnaires JavaScript utilisent « js_set » pour lire le certificat SSL/TLS ou la clé depuis un fichier.

Cet extrait de configuration utilise le dictionnaire partagé pour stocker les certificats et les clés dans la mémoire partagée, qui fait office de cache. Si la clé n’est pas présente, il lit le certificat ou la clé sur le disque, puis l’ajoute au cache.

Vous pouvez également exposer un emplacement permettant de vider le cache. Une fois les fichiers sur le disque mis à jour (par exemple, après le renouvellement des certificats et des clés), le dictionnaire partagé force leur relecture depuis le disque. Cette modification permet de renouveler les certificats et les clés sans avoir à redémarrer le processus NGINX.

http {     ...
    js_shared_dict_zone zone=kv:1m;
   
    server {
    …
     # Sets an njs function for the variable. Returns a value of cert/key
      js_set $dynamic_ssl_cert main.js_cert;
      js_set $dynamic_ssl_key main.js_key;
   
      # use variable's data
      ssl_certificate data:$dynamic_ssl_cert;
      ssl_certificate_key data:$dynamic_ssl_key;
     
     # a location to clear cache 
   location = /clear {
      js_content main.clear_cache;
      # allow 127.0.0.1;
      # deny all;
    }
  ...
  }

Et voici l’implémentation JavaScript de la rotation des certificats et des clés SSL/TLS à l’aide de « js_shared_dict_zone » :

function js_cert(r) {  if (r.variables['ssl_server_name']) {
    return read_cert_or_key(r, '.cert.pem');
  } else {
    return '';
  }
}

function js_key(r) {
  if (r.variables['ssl_server_name']) {
    return read_cert_or_key(r, '.key.pem');
  } else {
    return '';
  }
}
/** 
   * Retrieves the key/cert value from Shared memory or fallback to disk
   */
  function read_cert_or_key(r, fileExtension) {
    let data = '';
    let path = '';
    const zone = 'kv';
    let certName = r.variables.ssl_server_name;
    let prefix =  '/etc/nginx/certs/';
    path = prefix + certName + fileExtension;
    r.log('Resolving ${path}');
    const key = ['certs', path].join(':');
    const cache = zone && ngx.shared && ngx.shared[zone];
   
    if (cache) {
    data = cache.get(key) || '';
    if (data) {
      r.log(`Read ${key} from cache`);
      return data;
    }
  }
  try {
    data = fs.readFileSync(path, 'utf8');
    r.log('Read from cache');
  } catch (e) {
    data = '';
    r.log(`Error reading from file:${path}. Error=${e}`);
  }
  if (cache && data) {
    try {
      cache.set(key, data);
      r.log('Persisted in cache');
    } catch (e) {
      const errMsg = `Error writing to shared dict zone: ${zone}. Error=${e}`;
      r.log(errMsg);
    }
  }
  return data
}

En envoyant la requête « /clear », le cache est invalidé et NGINX charge le certificat ou la clé SSL/TLS depuis le disque lors de l’établissement de la connexion SSL/TLS suivante. Vous pouvez également implémenter un gestionnaire js_content qui récupère un certificat ou une clé SSL/TLS à partir de la requête, tout en le stockant dans le cache et en mettant celui-ci à jour.

Le code complet de cet exemple est disponible dans le dépôt GitHub de njs.

Commencez dès aujourd’hui

La fonction de dictionnaire partagé est un outil puissant pour la programmabilité de votre application, qui offre des avantages considérables en matière de simplification et d’évolutivité. En exploitant les capacités de js_shared_dict_zone, vous pouvez ouvrir de nouvelles perspectives de croissance et gérer efficacement l’augmentation du trafic.

Prêt à décupler les performances de votre déploiement NGINX avec js_shared_dict_zone ? Vous pouvez mettre à niveau votre déploiement NGINX avec js_shared_dict_zone afin d’explorer de nouveaux cas d’utilisation et d’en savoir plus sur cette fonctionnalité dans notre documentation. Vous trouverez également un exemple complet de fonction de dictionnaire partagé dans le récent projet njs-acme, qui permet à l’environnement d’exécution du module njs de fonctionner avec les fournisseurs ACME.

Si vous souhaitez vous lancer avec NGINX Open Source et que vous avez des questions, rejoignez le Slack de la communauté NGINX – présentez-vous et faites connaissance avec cette communauté d’utilisateurs de NGINX !


Partager
Mots-clés : F5 NGINX, Tech

Articles de blog associés

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA
NGINX | 13/10/2025

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA

Découvrez les principaux enseignements tirés des réponses à l’enquête annuelle F5 NGINX sur les dernières tendances en matière de technologies cloud natives, de sécurité, d’ingénierie de plateforme et d’IA.

Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?
NGINX | 03/11/2023

Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?

Lorsque de nouvelles CVE sont signalées, il est facile de ne plus savoir si elles concernent un outil de contrôleur Ingress NGINX particulier, car il existe plusieurs projets. Cet article présente les CVE et explique comment distinguer les différents projets de contrôleurs Ingress afin de dissiper toute confusion.

Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX
NGINX | 11/03/2020

Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX

Votre API répond-elle aux requêtes en moins de 30 ms ? Si ce n’est pas le cas, il ne s’agit pas d’une API en temps réel offrant la faible latence exigée par la grande majorité des organisations. Mesurez la latence de votre API avec l’outil rtapi de NGINX et découvrez comment NGINX peut l’aider à offrir une réactivité en temps réel.

Un testeur d’expressions régulières pour NGINX et NGINX Plus
NGINX | 11/06/2019

Un testeur d’expressions régulières pour NGINX et NGINX Plus

Le testeur d’expressions régulières (regex) pour NGINX et NGINX Plus vous évite de tâtonner en vous indiquant si une expression régulière utilisée dans un bloc location ou map correspond aux valeurs comme prévu. Il génère la configuration appropriée et affiche les valeurs des groupes de capture.

Caches partagés avec les clusters de cache NGINX Plus, partie 1
NGINX | 24/01/2017

Caches partagés avec les clusters de cache NGINX Plus, partie 1

Optimisez la capacité de votre cache web en le répartissant entre plusieurs serveurs de cache web NGINX ou NGINX Plus. Découvrez comment procéder dans cet article.

Introduction aux microservices
NGINX | 19/05/2015

Introduction aux microservices

Les microservices suscitent actuellement beaucoup d’intérêt. Cet article de blog est le premier d’une série de sept consacrée à la conception, au développement et au déploiement de microservices.