it-swarm.com.de

Wie führe ich mehrere Node.js-Sites (Apps / Server) mit separaten SSL-Zertifikaten auf einer einzigen IP-Adresse aus?

Das gewünschte Szenario sieht folgendermaßen aus: Mehrere Node.js-Server/Apps/Websites auf separaten Domänen mit jeweils eigenem SSL-Zertifikat auf einem einzelnen Server mit einer einzelnen IP-Adresse. Bisher habe ich versucht:

  • Ein Proxy fängt alle eingehenden Anfragen ab und leitet sie an die entsprechenden Apps/Server an separaten, nicht 443-Ports weiter: Funktioniert nicht, da der Proxy-Server dies kann Führen Sie nur ein einziges SSL-Zertifikat aus, das einen Fehler für alle Domänen bis auf eine auslöst.

  • Apps, die auf verschiedenen Ports ausgeführt werden und DNS zeigt auf diese Ports: Funktioniert nicht, da eine HTTPS-Verbindung immer zu Port 443. Der SRV-DNS-Eintrag kann dies für die Ports 443 und 80 nicht ändern.

  • Verwenden eines einzelnen SSL-Zertifikats, das für eine IP-Adresse ausgestellt wurde : Ist irgendwie möglich, aber nach einigen Nachforschungen ist dies keine so gute Idee.

  • Server, die auf bestimmte Hostnamen antworten : httpsServer.listen(443,'domain.name') wirft Error: listen EADDRNOTAVAIL 123.456.789.000:443. Hier erwartete ich, dass der Server alle Anforderungen außer denen ignoriert, bei denen hostname der domain.name ist. Sie können jedoch nicht mehrere Server an einem einzigen Port betreiben.

Zurück zu Punkt eins: Was ich brauche, ist ein Proxy, der eine Verbindung mit einem SSL-Zertifikat für den bestimmten angeforderten Hostnamen herstellt und die Anforderung an eine App/einen Server weiterleitet, die/der auf einem eindeutigen Port ausgeführt wird. Wie? BEARBEITEN: Die Verwendung von Nginx oder einer anderen Proxy-/Firewall-Software ist sicherlich eine Option, aber an dieser Stelle versuche ich, eine Node.js-only-Lösung zu finden.

1
Marko36

Sie können redbird verwenden, einen Node.js-Reverse-Proxy. Ihre Konfiguration sieht ungefähr so ​​aus

var proxy = require('redbird')({port: 80});

proxy.register("example1.com", "http://127.0.0.1:8001", {
  ssl: {
    letsencrypt: {
      email: '[email protected]', // Domain owner/admin email
      production: true, // WARNING: Only use this flag when the proxy is verified to work correctly to avoid being banned!
    }
  }
});

proxy.register("example2.com", "http://127.0.0.1:8002", {
  ssl: {
    letsencrypt: {
      email: '[email protected]', // Domain owner/admin email
      production: true, // WARNING: Only use this flag when the proxy is verified to work correctly to avoid being banned!
    }
  }
});