Die SSL/TLS-Zertifikatrotation kann ohne Neustart der Open-Source-Version von NGINX erreicht werden

Ursprünglicher Autor: Maxim Ivanitskiy von F5

Ursprünglicher Link: Die Rotation des SSL/TLS-Zertifikats kann ohne Neustart der Open-Source-Version von NGINX erreicht werden

Nachdruckquelle: NGINX Open Source Community


Die einzige offizielle chinesische Community von NGINX, alle unter nginx.org.cn 

In der Welt der Hochleistungs-Webserver ist NGINX  eine beliebte Wahl, da es aufgrund seiner leichten und effizienten Architektur große Datenverkehrsmengen verarbeiten kann. Durch die Einführung der Shared-Dictionary- Funktion im  NGINX-JavaScript-Modul (njs) wurde die Leistung von NGINX auf die nächste Stufe gehoben.

In diesem Artikel untersuchen wir die Funktionen und Vorteile der gemeinsam genutzten njs-Wörterbücher und zeigen, wie Sie NGINX Open Source so einrichten, dass SSL/TLS-Zertifikate ohne Neustart rotieren.

Einführung in gemeinsame Wörterbücher und ihre Vorteile

Die neue Richtlinie ermöglicht es NGINX-Open-Source-Benutzern, gemeinsam genutzte Speicherbereiche für den effizienten Datenaustausch zwischen Arbeitsprozessen zu aktivieren. Diese gemeinsam genutzten Speicherbereiche fungieren als Schlüsselwertwörterbücher und speichern dynamische Konfigurationseinstellungen, auf die in Echtzeit zugegriffen und diese geändert werden können. js_shared_dict_zone 

Zu den Hauptvorteilen gemeinsam genutzter Wörterbücher gehören:

  • Minimaler Overhead und einfach zu bedienen –  Direkt in njs integriert, ist es dank einer intuitiven API und einfachen Implementierung einfach zu konfigurieren und zu verwenden. Es hilft Ihnen auch dabei, die Datenverwaltung und den Datenaustausch zwischen Arbeitsprozessen zu vereinfachen.
  • Leicht und effizient –  ​​lässt sich nahtlos in NGINX integrieren und nutzt dessen ereignisgesteuertes, nicht blockierendes I/O-Modell. Diese Methode reduziert die Speichernutzung und verbessert die Fähigkeiten zur gleichzeitigen Verarbeitung, sodass NGINX eine große Anzahl gleichzeitiger Verbindungen effizient verarbeiten kann.
  • Skalierbarkeit –  Mit der Fähigkeit von NGINX, horizontal über mehrere Arbeitsprozesse hinweg zu skalieren, können Sie Daten zwischen diesen Prozessen teilen und synchronisieren, ohne dass komplexe Kommunikationsmechanismen zwischen Prozessen erforderlich sind. Mit den Time-to-Live-Einstellungen (TTL) können Sie Datensätze in freigegebenen Wörterbucheinträgen verwalten und inaktive Einträge aus der Zone entfernen. Der Evict-Parameter löscht das älteste Schlüssel-Wert-Paar, um Platz für neue Einträge zu schaffen.

SSL-Rotation mithilfe eines gemeinsamen Wörterbuchs

Einer der effektivsten Anwendungsfälle für gemeinsam genutzte Wörterbücher ist die SSL/TLS-Rotation. Bei Verwendung können SSL/TLS-Zertifikate oder Schlüssel aktualisiert werden, ohne NGINX neu zu starten. Darüber hinaus bietet es eine REST-ähnliche API zum Verwalten von Zertifikaten auf NGINX. js_shared_dict_zone 

Nachfolgend finden Sie ein Beispiel für eine NGINX-Konfigurationsdatei, die die Anweisungen und zum Einrichten eines HTTPS-Servers verwendet. Ein JavaScript-Handler, der ein SSL/TLS-Zertifikat oder einen Schlüssel aus einer Datei liest. js_set  ssl_certificate  js_set 

Dieser Konfigurationsausschnitt verwendet ein gemeinsames Wörterbuch, um Zertifikate und Schlüssel als Cache im gemeinsamen Speicher zu speichern. Wenn kein Schlüssel vorhanden ist, wird das Zertifikat oder der Schlüssel von der Festplatte gelesen und im Cache abgelegt.

Sie können auch einen Speicherort freigeben, um den Cache manuell zu leeren. Sobald Dateien auf der Festplatte aktualisiert werden (z. B. Zertifikats- und Schlüsselaktualisierungen), liest das freigegebene Wörterbuch diese Aktualisierungen von der Festplatte. Diese Anpassung ermöglicht die Rotation von Zertifikaten/Schlüsseln, ohne den NGINX-Prozess neu zu starten.

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;
    }
  ...
  }

Hier ist eine JavaScript-Implementierung mit rotierenden SSL/TLS-Zertifikaten und -Schlüsseln: 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
}

Sie können den Cache ungültig machen, indem Sie eine Anfrage senden, damit NGINX beim nächsten SSL/TLS-Handshake das SSL/TLS-Zertifikat oder den Schlüssel von der Festplatte lädt. Darüber hinaus können Sie verwenden, um ein SSL/TLS-Zertifikat oder einen SSL-/TLS-Schlüssel aus der Anfrage abzurufen, während Sie den Cache beibehalten und aktualisieren. /clear  js_content 

Der vollständige Code für dieses Beispiel finden Sie im  njs GitHub-Repository .

Sofort starten

Die Shared-Dictionary-Funktion ist ein leistungsstarkes Tool zur Anwendungsprogrammierung, das erhebliche Vorteile in Bezug auf Einfachheit und Skalierbarkeit bietet. Mit Funktionen können Sie neue Wachstumschancen entdecken und wachsende Traffic-Anforderungen effizient bewältigen. js_shared_dict_zone 

Sind Sie bereit, Ihre NGINX-Bereitstellung zu beschleunigen? Sie können Ihre NGINX-Bereitstellung aktualisieren, um neue Anwendungsfälle zu erschließen. Weitere Informationen zu dieser Funktion finden Sie in unserer Dokumentation . Darüber hinaus können Sie im kürzlich gestarteten njs-acme-Projekt ein vollständiges Beispiel der Shared-Dictionary-Funktionalität sehen , das die Zusammenarbeit der njs-Modullaufzeit mit ACME-Anbietern ermöglicht. js_shared_dict_zone  js_shared_dict_zone  

Wenn Sie an der Open-Source-Version von NGINX interessiert sind oder Fragen haben, können Sie gerne Xiao N Assistant auf WeChat (WeChat-ID: nginxoss) hinzufügen, um der offiziellen WeChat-Gruppe von NGINX beizutreten, um mehr zu erfahren, Fragen zu stellen und Feedback zu NGINX zu erhalten Open-Source-Version.


Die einzige offizielle chinesische Community von NGINX, alle unter  nginx.org.cn

Weitere technische Informationen zu NGINX, interaktive Fragen und Antworten, Kursreihen und Veranstaltungsressourcen:  Offizielle Website der Open Source Community  | 

Ein in den 1990er Jahren geborener Programmierer hat eine Videoportierungssoftware entwickelt und in weniger als einem Jahr über 7 Millionen verdient. Das Ende war sehr bestrafend! High-School-Schüler erstellen im Rahmen einer Coming-of-Age-Zeremonie ihre eigene Open-Source-Programmiersprache – scharfe Kommentare von Internetnutzern: Der inländische Dienst Taobao (taobao.com) verließ sich aufgrund des grassierenden Betrugs auf RustDesk und stellte die inländischen Dienste ein und startete die Arbeit zur Optimierung der Webversion von Java neu 17 ist die am häufigsten verwendete Java LTS-Version. Windows 11 erreicht weiterhin einen Rückgang. Open Source Daily unterstützt die Übernahme von Open Source Rabbit R1; Electric schließt die offene Plattform Apple veröffentlicht M4-Chip Google löscht Android Universal Kernel (ACK) Unterstützung für RISC-V-Architektur Yunfeng ist von Alibaba zurückgetreten und plant, in Zukunft unabhängige Spiele auf der Windows-Plattform zu produzieren
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/5246775/blog/11102086
Empfohlen
Rangfolge