web-dev-qa-db-fra.com

Comment exécuter plusieurs sites Node.js (applications / serveurs) avec des certificats SSL distincts, sur une même adresse IP?

Le scénario souhaité est comme le titre le suggère: Plusieurs serveurs/applications/sites Web Node.js, sur des domaines distincts, chacun avec son propre certificat SSL, sur un serveur unique avec une seule adresse IP. Jusqu'ici j'ai essayé:

  • Un proxy capturant toutes les demandes entrantes et les transférant vers les applications/serveurs respectifs, sur des ports non 443 distincts: ne fonctionne pas, car le serveur proxy peut ne fonctionne que sur un seul certificat SSL, ce qui générera une erreur pour tous les domaines sauf un.

  • Applications fonctionnant sur différents ports et DNS pointant sur ces ports: ne fonctionne pas, car une connexion HTTPS ira toujours à port 443. L’enregistrement DNS SRV ne peut pas changer cela, pour les ports 443 et 80.

  • Utiliser un seul certificat SSL émis pour une adresse IP : est possible, mais après quelques recherches, ce n'est pas une si bonne idée.

  • Serveurs répondant à des noms d'hôte spécifiques : httpsServer.listen(443,'domain.name') lève Error: listen EADDRNOTAVAIL 123.456.789.000:443. C'est là que je m'attendais à ce que le serveur ignore toutes les demandes, mais celles où hostname est le domain.name Néanmoins, vous ne pouvez pas exécuter plusieurs serveurs sur un seul port.

Revenons donc à la case départ: il me faut un proxy, qui établit une connexion avec un certificat SSL pour le nom d’hôte demandé spécifique, et transmet la demande à une application/serveur exécutée sur un port unique. Comment? EDIT: Utiliser Nginx, ou un autre logiciel de proxy/pare-feu est certainement une option, mais pour le moment, j'essaie de trouver une solution uniquement Node.js.

1
Marko36

Vous pouvez utiliser redbird , un proxy inverse Node.js. Votre configuration ressemblera à quelque chose comme ça

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!
    }
  }
});
2