BLOG | NGINX

SSL/TLS-Zertifikatsrotation ohne Neustarts in NGINX Open Source

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Maxim Ivanitskiy Miniaturbild
Maxim Ivanitski
Veröffentlicht am 26. September 2023

In der Welt der Hochleistungs-Webserver ist NGINX eine beliebte Wahl, da es aufgrund seiner leichten und effizienten Architektur große Datenmengen verarbeiten kann. Mit der Einführung der gemeinsamen Wörterbuchfunktion als Teil des NGINX JavaScript-Moduls (njs) erreichen die Leistungsfunktionen von NGINX die nächste Stufe.

In diesem Blogbeitrag untersuchen wir die Funktionalität und Vorteile des gemeinsamen Wörterbuchs von njs und zeigen, wie NGINX Open Source eingerichtet wird, ohne dass beim Rotieren von SSL/TLS-Zertifikaten ein Neustart erforderlich ist.

Grundlagen und Vorteile des gemeinsamen Wörterbuchs

Die neue Direktive js_shared_dict_zone ermöglicht es Benutzern von NGINX Open Source, gemeinsam genutzte Speicherzonen für einen effizienten Datenaustausch zwischen Arbeitsprozessen zu aktivieren. Diese gemeinsam genutzten Speicherzonen fungieren als Schlüssel-Wert-Wörterbücher und speichern dynamische Konfigurationseinstellungen, auf die in Echtzeit zugegriffen und die geändert werden können.

Zu den Hauptvorteilen des gemeinsamen Wörterbuchs gehören:

  • Minimaler Aufwand und einfache Verwendung – Direkt in njs integriert, ist es mit einer intuitiven API und unkomplizierter Implementierung einfach bereitzustellen und zu verwenden. Darüber hinaus vereinfacht es die Verwaltung und gemeinsame Nutzung von Daten zwischen Arbeitsprozessen.
  • Leichtgewichtig und effizient – Nahtlose Integration mit NGINX und Nutzung des ereignisgesteuerten, nicht blockierenden E/A-Modells. Dieser Ansatz reduziert den Speicherverbrauch und verbessert die Parallelität, sodass NGINX viele gleichzeitige Verbindungen effizient verarbeiten kann.
  • Skalierbarkeit – Nutzt die Fähigkeit von NGINX zur horizontalen Skalierung über mehrere Arbeitsprozesse hinweg, sodass Sie Daten zwischen diesen Prozessen teilen und synchronisieren können, ohne dass komplexe Mechanismen zur prozessübergreifenden Kommunikation erforderlich sind. Mit der Time-to-Live-Einstellung (TTL) können Sie Datensätze in gemeinsam genutzten Wörterbucheinträgen verwalten, indem Sie sie aufgrund von Inaktivität aus der Zone entfernen. Der evict- Parameter entfernt das älteste Schlüssel-Wert-Paar, um Platz für neue Einträge zu schaffen.

SSL-Rotation mit dem Shared Dictionary

Einer der wirkungsvollsten Anwendungsfälle für das gemeinsame Wörterbuch ist die SSL/TLS-Rotation. Wenn Sie js_shared_dict_zone verwenden, müssen Sie NGINX im Falle einer Aktualisierung des SSL/TLS-Zertifikats oder -Schlüssels nicht neu starten. Darüber hinaus erhalten Sie eine REST-ähnliche API zur Verwaltung von Zertifikaten auf NGINX.

Unten sehen Sie ein Beispiel der NGINX-Konfigurationsdatei, die den HTTPS-Server mit den Anweisungen js_set und ssl_certificate einrichtet. Die JavaScript-Handler verwenden js_set , um das SSL/TLS-Zertifikat oder den Schlüssel aus einer Datei zu lesen.

Dieser Konfigurationsausschnitt verwendet das gemeinsame Wörterbuch, um Zertifikate und Schlüssel im gemeinsamen Speicher als Cache zu speichern. Wenn der Schlüssel nicht vorhanden ist, liest es das Zertifikat oder den Schlüssel von der Festplatte und legt es in den Cache.

Sie können auch einen Speicherort angeben, der den Cache löscht. Sobald Dateien auf der Festplatte aktualisiert werden (z. B. die Zertifikate und Schlüssel erneuert werden), erzwingt das gemeinsame Wörterbuch das Lesen von der Festplatte. Diese Anpassung ermöglicht die Rotation von Zertifikaten/Schlüsseln, ohne dass der NGINX-Prozess neu gestartet werden muss.

http { ... js_shared_dict_zone zone=kv:1m;
server { … # Legt eine njs-Funktion für die Variable fest. Gibt einen Zertifikat-/Schlüsselwert zurück js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# Daten der Variable verwenden ssl_certificate data:$dynamic_ssl_cert; ssl_certificate_key data:$dynamic_ssl_key;
# ein Ort zum Löschen des Cache location = /clear { js_content main.clear_cache; # allow 127.0.0.1; # deny all; }
... }

Und hier ist die JavaScript-Implementierung für die Rotation von SSL/TLS-Zertifikaten und -Schlüsseln mit js_shared_dict_zone :

Funktion js_cert(r) { if (r.variables['ssl_server_name']) { return read_cert_or_key(r, '.cert.pem'); } sonst { return ''; } } Funktion js_key(r) { if (r.variables['ssl_server_name']) { return read_cert_or_key(r, '.key.pem'); } sonst { return ''; } } /** * Ruft den Schlüssel-/Zertifikatswert aus dem gemeinsam genutzten Speicher ab oder greift auf die Festplatte zurück */ Funktion read_cert_or_key(r, Dateierweiterung) { let data = ''; let path = ''; const zone = 'kv'; let certName = r.variables.ssl_server_name; let prefix = '/etc/nginx/certs/'; path = Präfix + Zertifikatsname + Dateierweiterung; r.log('Auflösen${path} '); const key = ['certs', path].join(':'); const cache = zone && ngx.shared && ngx.shared[zone];
if (cache) { data = cache.get(key) || ''; if (data) { r.log(`Lesen${key} aus dem Cache`); returniere Daten; } } versuche { Daten = fs.readFileSync(Pfad, 'utf8'); r.log('Aus dem Cache lesen'); } fange (e) { Daten = ''; r.log(`Fehler beim Lesen aus der Datei:${path} . Fehler=${e} `); } if (cache && data) { try { cache.set(key, data); r.log('Im Cache gespeichert'); } catch (e) { const errMsg = `Fehler beim Schreiben in die gemeinsam genutzte Dict-Zone:${zone} . Fehler=${e} `; r.log(errMsg); } } Daten zurückgeben }

Durch das Senden der /clear -Anforderung wird der Cache ungültig gemacht und NGINX lädt das SSL/TLS-Zertifikat oder den Schlüssel beim nächsten SSL/TLS-Handshake von der Festplatte. Darüber hinaus können Sie einen js_content implementieren, der ein SSL/TLS-Zertifikat oder einen Schlüssel aus der Anforderung übernimmt und gleichzeitig den Cache speichert und aktualisiert.

Den vollständigen Code dieses Beispiels finden Sie im njs GitHub-Repository .

Legen Sie noch heute los

Die Funktion „Gemeinsames Wörterbuch“ ist ein leistungsstarkes Tool für die Programmierbarkeit Ihrer Anwendung, das erhebliche Vorteile hinsichtlich Rationalisierung und Skalierbarkeit bietet. Indem Sie die Funktionen von js_shared_dict_zone nutzen, können Sie neue Wachstumsmöglichkeiten erschließen und steigende Verkehrsanforderungen effizient bewältigen.

Sind Sie bereit, Ihre NGINX-Bereitstellung mit js_shared_dict_zone zu beschleunigen? Sie können Ihre NGINX-Bereitstellung mit js_shared_dict_zone aktualisieren, um neue Anwendungsfälle freizuschalten und in unserer Dokumentation mehr über diese Funktion zu erfahren. Darüber hinaus können Sie im kürzlich eingeführten Projekt njs-acme ein vollständiges Beispiel einer gemeinsam genutzten Wörterbuchfunktion sehen, die es der Laufzeit des njs-Moduls ermöglicht, mit ACME-Anbietern zu arbeiten.

Wenn Sie an den ersten Schritten mit NGINX Open Source interessiert sind und Fragen haben, treten Sie dem NGINX Community Slack bei – stellen Sie sich vor und lernen Sie diese Community von NGINX-Benutzern kennen!


„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."