Ich habe versucht, HTTPS mit einem node.js-Projekt einzurichten, an dem ich arbeite. Ich habe im Wesentlichen die Dokumentation zu node.js für dieses Beispiel befolgt :
// curl -k https://localhost:8000/
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
Nun, wenn ich es tue
curl -k https://localhost:8000/
Ich bekomme
hello world
wie erwartet. Aber wenn ich es mache
curl -k http://localhost:8000/
Ich bekomme
curl: (52) Empty reply from server
Rückblickend scheint dies offensichtlich, dass es auf diese Weise funktionieren würde, aber gleichzeitig werden Leute, die mein Projekt schließlich besuchen, nicht https : // yadayada eingeben, und ich möchte, dass der gesamte Datenverkehr von dem Moment an https ist, in dem sie eintreffen der Standort.
Wie kann ich den Knoten (und Express, da dies das Framework ist, das ich verwende) dazu bringen, den gesamten eingehenden Datenverkehr an https weiterzuleiten, unabhängig davon, ob er angegeben wurde oder nicht? Ich konnte keine Dokumentation finden, die sich damit befasst. Oder wird nur angenommen, dass in einer Produktionsumgebung ein Knoten etwas vor sich hat (z. B. Nginx), das diese Art der Umleitung handhabt?
Dies ist mein erster Ausflug in die Webentwicklung. Bitte verzeihen Sie meine Unwissenheit, wenn dies offensichtlich ist.
Antworten:
Ryan, danke, dass du mich in die richtige Richtung gelenkt hast. Ich habe Ihre Antwort (2. Absatz) ein wenig mit etwas Code ausgearbeitet und es funktioniert. In diesem Szenario werden diese Codefragmente in meine Express-App eingefügt:
Der https-Express-Server überwacht den Geldautomaten auf 3000. Ich habe diese iptables-Regeln eingerichtet, damit der Knoten nicht als root ausgeführt werden muss:
Alles in allem funktioniert das genau so, wie ich es wollte.
quelle
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
if(!req.secure){}
if(req.protocol==='http')
AussageWenn Sie herkömmlichen Ports folgen, da HTTP standardmäßig Port 80 und HTTPS standardmäßig Port 443 versucht, können Sie einfach zwei Server auf demselben Computer haben: Hier ist der Code:
Test mit https:
Mit http:
Weitere Details: Nodejs HTTP und HTTPS über denselben Port
quelle
res.writeHead(301, etc.)
wird nur für GET-Aufrufe korrekt funktionieren, da301
der Client nicht angewiesen wird, dieselbe Methode zu verwenden. Wenn Sie die verwendete Methode (und alle anderen Parameter) beibehalten möchten, müssen Sie sie verwendenres.writeHead(307, etc.)
. Und wenn es immer noch nicht funktioniert, müssen Sie möglicherweise ein Proxy durchführen. Quelle: http://stackoverflow.com/a/17612942/1876359Vielen Dank an diesen Typen: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
quelle
app.enable('trust proxy');
Mit Nginx können Sie den "x-forwarded-proto" -Header nutzen:
quelle
app.enable('trust proxy');
: "Zeigt an, dass sich die App hinter einem nach vorne gerichteten Proxy befindet, und die X-Forwarded- * -Header verwenden, um die Verbindung und die IP-Adresse des Clients zu bestimmen." expressjs.com/en/4x/api.html#app.setAb 0.4.12 gibt es keine wirklich saubere Möglichkeit, HTTP und HTTPS am selben Port mithilfe der HTTP / HTTPS-Server von Node abzuhören.
Einige Benutzer haben dieses Problem gelöst, indem der HTTPS-Server von Node (dies funktioniert auch mit Express.js) 443 (oder einen anderen Port) abhört und einen kleinen http-Server an 80 bindet und Benutzer an den sicheren Port umleitet.
Wenn Sie unbedingt in der Lage sein müssen, beide Protokolle an einem einzigen Port zu verarbeiten, müssen Sie nginx, lighttpd, apache oder einen anderen Webserver an diesen Port anschließen und als Reverse-Proxy für Node fungieren.
quelle
Sie können das Express-Force-https- Modul verwenden:
npm install --save express-force-https
quelle
app
. (siehe diese Antwort )Ich verwende die von Basarat vorgeschlagene Lösung, muss aber auch den Port überschreiben, da ich früher zwei verschiedene Ports für HTTP- und HTTPS-Protokolle hatte.
Ich bevorzuge es auch, keinen Standardport zu verwenden, um NodeJS ohne Root-Rechte zu starten. Ich mag 8080 und 8443, weil ich aus vielen Jahren der Programmierung auf Tomcat stamme.
Meine komplette Datei wird
Dann verwende ich iptable, um 80- und 443-Verkehr auf meinen HTTP- und HTTPS-Ports zu formulieren.
quelle
Diese Antwort muss aktualisiert werden, damit sie mit Express 4.0 funktioniert. So habe ich den separaten http-Server zum Laufen gebracht:
quelle
Wenn sich Ihre App hinter einem vertrauenswürdigen Proxy befindet (z. B. einem AWS ELB oder einem korrekt konfigurierten Nginx), sollte dieser Code funktionieren:
Anmerkungen:
quelle
Ich finde, dass req.protocol funktioniert, wenn ich Express verwende (habe nicht ohne getestet, aber ich vermute, dass es funktioniert). unter Verwendung des aktuellen Knotens 0.10.22 mit Express 3.4.3
quelle
Die meisten Antworten hier schlagen vor, den Header req.headers.host zu verwenden.
Der Host-Header wird von HTTP 1.1 benötigt, ist jedoch optional, da der Header möglicherweise nicht von einem HTTP-Client gesendet wird und Node / Express diese Anforderung akzeptiert.
Sie könnten fragen: Welcher HTTP-Client (z. B. Browser) kann eine Anfrage senden, bei der dieser Header fehlt? Das HTTP-Protokoll ist sehr trivial. Sie können eine HTTP-Anforderung in wenigen Codezeilen erstellen, um keinen Host-Header zu senden. Wenn Sie jedes Mal eine fehlerhafte Anforderung erhalten, wird eine Ausnahme ausgelöst. Je nachdem, wie Sie mit solchen Ausnahmen umgehen, kann dies Ihren Server herunterfahren.
Überprüfen Sie also immer alle Eingaben . Dies ist keine Paranoia. Ich habe Anfragen erhalten, denen der Host-Header in meinem Dienst fehlt.
Außerdem behandeln nie URLs als Strings . Verwenden Sie das Knoten-URL-Modul, um bestimmte Teile einer Zeichenfolge zu ändern. Das Behandeln von URLs als Zeichenfolgen kann auf viele verschiedene Arten ausgenutzt werden. Tu es nicht.
quelle
Dies ist, was wir verwenden und es funktioniert großartig!
quelle
Sie können das "net" -Modul verwenden, um auf HTTP und HTTPS am selben Port zu warten
quelle
Das hat bei mir funktioniert:
quelle
Sie können 2 Node.js-Server instanziieren - einen für HTTP und HTTPS
Sie können auch eine Setup-Funktion definieren, die beide Server ausführen, sodass Sie nicht viel doppelten Code schreiben müssen.
So habe ich es gemacht: (mit restify.js, sollte aber für express.js oder auch für den Knoten selbst funktionieren)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
quelle
Das hat bei mir funktioniert:
Empfehlen Sie, die Header hinzuzufügen, bevor Sie zu https umleiten
Wenn Sie dies tun:
Du erhältst:
Ich benutze Express 4.17.1
quelle