BLOG | NGINX

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

NGINX-Partie-de-F5-horiz-black-type-RGB
Maxim Ivanitskiy Miniature
Maxime Ivanitski
Publié le 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 de grandes charges de trafic. Avec l'introduction de la fonction de dictionnaire partagé dans le cadre du module JavaScript NGINX (njs) , les capacités de performance de NGINX atteignent le niveau supérieur.

Dans cet article de blog, nous explorons les fonctionnalités et les avantages du dictionnaire partagé njs et montrons comment configurer NGINX Open Source sans avoir besoin de redémarrer lors de la rotation 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 les zones de mémoire partagée pour un échange de données efficace entre les processus de travail. Ces zones de mémoire partagée agissent comme des dictionnaires clé-valeur, stockant 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 :

  • Frais généraux minimes et facilité d'utilisation – Intégré directement dans njs, il est facile à provisionner et à utiliser avec une API intuitive et une implémentation simple. Il vous aide également à simplifier le processus de gestion et de 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 bloquant piloté par événements. Cette approche réduit l’utilisation de la mémoire et améliore la concurrence, permettant à NGINX de gérer efficacement de nombreuses connexions simultanées.
  • Évolutivité – Exploite la capacité de NGINX à évoluer horizontalement sur plusieurs processus de travail afin que vous puissiez partager et synchroniser les données entre ces processus sans avoir besoin de mécanismes de communication interprocessus complexes. Le paramètre de durée de vie (TTL) vous permet de gérer les enregistrements dans les entrées de dictionnaire partagé en les supprimant de la zone en raison de leur inactivité. Le paramètre evict supprime la paire clé-valeur la plus ancienne pour faire de la place pour de nouvelles entrées.

Rotation SSL avec le dictionnaire partagé

L’un des cas d’utilisation les plus impactants pour le dictionnaire partagé est la rotation 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, il vous offre une API de type REST pour gérer les certificats sur NGINX.

Vous trouverez ci-dessous un exemple du fichier de configuration NGINX qui configure le serveur HTTPS avec les directives js_set et ssl_certificate . Les gestionnaires JavaScript utilisent js_set pour lire le certificat ou la clé SSL/TLS à partir d'un fichier.

Cet extrait de configuration utilise le dictionnaire partagé pour stocker les certificats et les clés dans la mémoire partagée en tant que cache. Si la clé n'est pas présente, il lit le certificat ou la clé à partir du disque et le place dans le cache.

Vous pouvez également exposer un emplacement qui efface le cache. Une fois les fichiers sur le disque mis à jour (par exemple, les certificats et les clés sont renouvelés), le dictionnaire partagé impose la lecture à partir du disque. Ce réglage permet de faire tourner les certificats/clés sans avoir besoin de redémarrer le processus NGINX.

http { ... js_shared_dict_zone zone=kv:1m;
serveur { … # Définit une fonction njs pour la variable. Renvoie une valeur de cert/key js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# utiliser les données de la variable ssl_certificate data:$dynamic_ssl_cert; ssl_certificate_key data:$dynamic_ssl_key;
# un emplacement pour vider le cache location = /clear { js_content main.clear_cache; # autoriser 127.0.0.1; # refuser tout; }
... }

Et voici l'implémentation JavaScript pour la rotation des certificats et clés SSL/TLS en utilisant 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 ''; } } /** * Récupère la valeur de clé/cert de la mémoire partagée ou se replie sur le disque */ 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('Résolution de ${path}'); const key = ['certs', path].join(':'); const cache = zone && ngx.shared && ngx.shared[zone];
if (cache) { data = cache.get(key) || ''; if (data) { r.log(`Lire ${key} depuis le cache`); renvoyer les données; } } essayer { data = fs.readFileSync(path, 'utf8'); r.log('Lire depuis le cache'); } catch (e) { data = ''; r.log(`Erreur de lecture depuis le fichier : ${path}. Erreur=${e}`); } if (cache && data) { try { cache.set(key, data); r.log('Persisted in cache'); } catch (e) { const errMsg = `Erreur d'écriture dans la zone de dictionnaire partagé : ${zone}. Erreur=${e}`; r.log(errMsg); } } renvoyer des données }

En envoyant la requête /clear , le cache est invalidé et NGINX charge le certificat ou la clé SSL/TLS à partir du disque lors de la prochaine négociation SSL/TLS. De plus, vous pouvez implémenter un js_content qui prend un certificat ou une clé SSL/TLS de la requête tout en conservant et en mettant à jour le cache également.

Le code complet de cet exemple peut être trouvé dans le dépôt GitHub njs .

Commencez dès aujourd'hui

La fonction de dictionnaire partagé est un outil puissant pour la programmabilité de votre application qui apporte des avantages significatifs en termes de rationalisation et d'évolutivité. En exploitant les capacités de js_shared_dict_zone , vous pouvez débloquer de nouvelles opportunités de croissance et gérer efficacement les demandes de trafic croissantes.

Prêt à dynamiser votre déploiement NGINX avec js_shared_dict_zone ? Vous pouvez mettre à niveau votre déploiement NGINX avec js_shared_dict_zone pour débloquer de nouveaux cas d'utilisation et en savoir plus sur cette fonctionnalité dans notre documentation . De plus, vous pouvez voir un exemple complet d'une fonction de dictionnaire partagé dans le projet njs-acme récemment introduit, qui permet au runtime du module njs de fonctionner avec les fournisseurs ACME.

Si vous souhaitez vous lancer avec NGINX Open Source et avez des questions, rejoignez NGINX Community Slack – présentez-vous et apprenez à connaître cette communauté d'utilisateurs NGINX !


« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."