Automatische HTTPS-Verbindung/redirect mit Knoten.js/express
Ich habe versucht, HTTPS eingerichtet mit einem node.js Projekt an dem ich arbeite. Ich habe im wesentlichen folgte der node.js Dokumentation für dieses Beispiel:
//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
curl -k https://localhost:8000/
Bekomme ich
hello world
als erwartet. Aber wenn ich
curl -k http://localhost:8000/
Bekomme ich
curl: (52) Empty reply from server
Im Rückblick scheint klar, dass es funktionieren würde auf diese Weise, aber zur gleichen Zeit, Menschen, die schließlich besuchen Sie mein Projekt nicht geben https://yadayada, und ich möchte, dass alle Datenverkehr an https, sobald Sie Treffer der Website.
Wie bekomme ich die Knoten (und die Express-das ist der Rahmen, den ich verwende), die hand von allen eingehenden Datenverkehr an https, unabhängig davon, ob oder nicht es angegeben wurde? Ich habe nicht in der Lage zu finden, keine Dokumentation, die sich mit diesem. Oder ist es einfach davon ausgegangen, dass in einer Produktionsumgebung Knoten hat etwas, das vor ihm sitzt (z.B. nginx) behandelt diese Art der Umleitung?
Dies ist mein Erster Vorstoß in die web-Entwicklung, also bitte verzeihen Sie meine Unwissenheit, wenn dies ist etwas, offensichtlich.
für jedermann BEREITSTELLEN ZU HEROKU, die Antworten in dieser Frage nicht helfen, Sie (erhalten Sie "zu viele Weiterleitungen"), aber Antwort eine andere Frage
InformationsquelleAutor Jake | 2011-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ryan, danke für den Hinweis mich in die richtige Richtung. Ich konkretisiert Sie Ihre Antwort (2. Absatz) ein wenig mit dem code und es funktioniert. In diesem Szenario werden diese code-Schnipsel sind in meinen express-app:
Den https-express-server überwacht ATM auf 3000. Ich richten Sie diese mit iptables-Regeln, so dass Knoten nicht als root laufen:
Alle zusammen, dies funktioniert genau so, wie ich es wollte.
Wie würde ich dieses Problem beheben resultierende symptom?
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
Eigentlich dies scheint mir besser,... nur wickeln Sie die Umleitung mit
if(!req.secure){}
Ich möchte nur darauf hinweisen, die Antwort auf @Costa die wichtige Frage nach der Sicherheit in einem anderen post - stackoverflow.com/questions/8605720/...
vielleicht möchten Sie für wrap-around-ein
if(req.protocol==='http')
- AnweisungInformationsquelleAutor Jake
Wenn Sie Folgen Sie der herkömmlichen ports da HTTP versucht standardmäßig port 80 und HTTPS versucht den port 443 standardmäßig können Sie einfach zwei server auf der gleichen Maschine:
Hier ist der code:
Test mit https:
Mit http:
Mehr details : Nodejs HTTP und HTTPS über gleichen port
res.writeHead(301, etc.)
wird nur gehen, um korrekt zu arbeiten, für Anrufe zu ERHALTEN, da301
nicht sagen, den client für die Verwendung der gleichen Methode. Wenn Sie möchten, um die Methode, die verwendet (und all die anderen Parameter), die Sie haben zu verwendenres.writeHead(307, etc.)
. Und wenn es immer noch nicht funktioniert, könnten Sie haben zu tun, einige proxying. Quelle: http://stackoverflow.com/a/17612942/1876359InformationsquelleAutor basarat
Dank dieser Kerl:
https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
Vereinbart, sollte die erste Antwort.
Die folgende Zeile geholfen, diese Lösung funktioniert bei mir:
app.enable('trust proxy');
Wie oben erwähnt ^^^^ : 'trust proxy' ist erforderlich, wenn Sie hinter einer beliebigen Art von proxy -, firewall-und Lastenausgleichsmodul-Umleitung Verkehr: z.B. AWS load balancing schickt alle http - & https-requests die gleichen nicht-root-port (z.B. 3000) auf Ihrem VPC-webserver.
Ich bin damit einverstanden, fantastische Antwort!!!!
InformationsquelleAutor Jeremias Binder
Mit Nginx können Sie die Vorteile von "x-forwarded-proto" header:
Ich fand die gleiche ist, erscheint sehr unzuverlässig.
req.sicher ist der richtige Weg, aber das ist buggy, wenn Sie hinter einem proxy, weil req.sicher ist äquivalent zu proto == "https", aber hinter einem proxy-express kann sagen, dass Ihre proto https,http
Sie müssen
app.enable('trust proxy');
: "Gibt an, die app ist hinter einer front-facing-proxy, und verwenden Sie die X-Forwarded-* Kopfzeilen zu bestimmen, die Verbindung und die IP-Adresse des client." expressjs.com/en/4x/api.html#app.setNicht behandeln urls als strings, verwenden Sie die url-Modul statt.
InformationsquelleAutor ccyrille
Als der 0.4.12 haben wir keine echte saubere Art und Weise des Zuhörens für HTTP & HTTPS auf dem gleichen port mit Knoten HTTP - /HTTPS-Server.
Einige Leute haben dieses Problem gelöst, indem er mit Knoten in der HTTPS-server (funktioniert mit Express.js als gut) hören 443 (oder einen anderen Hafen) und haben auch einen kleinen http-server zu binden 80 und umleiten von Benutzern auf der sicheren port.
Wenn Sie absolut müssen in der Lage sein, um Protokolle auf einem port dann müssen Sie nginx, lighttpd, apache oder einen anderen web-server auf diesem port und agieren als reverse-proxy für den Knoten.
Ihre Node.js Anwendung kann über mehrere http(s) Server. Ich habe in der Node.js Fragen (github.com/joyent/node/issues) und die mailing-Liste (groups.google.com/group/nodejs) und sehe keine Probleme gemeldet, aber getan hat, siehe paar posts über das problem auf der mailing-Liste. So weit wie ich kann sagen, dass diese nicht in das Rohr. Ich würde empfehlen, reporting es auf github und sehen, welches feedback Sie bekommen.
Wirklich wichtige Frage (zur Sicherheit). Vor, die Umleitung passiert eigentlich, ist es möglich, dass ein "Angreifer" zu erschnüffeln und stehlen ein cookie(session-ID)?
Ja, ein 3xx Statuscode und ggf. einen Location-header gesendet werden, zurück zu den Agenten, die agent-Anfragen der URL angegeben, von der Location-header.
Es ist 2015, ist das immer noch der Fall?
InformationsquelleAutor Ryan Olds
Diese Antwort muss aktualisiert werden, um die Arbeit mit Express 4.0. Hier ist, wie ich die eigenen http-server zu arbeiten:
InformationsquelleAutor NoBrainer
Ich finde req.Protokoll funktioniert, wenn ich mit express (noch nicht getestet habe ohne, aber ich vermute, es funktioniert). mit aktuellen Knotens 0.10.22 mit express 3.4.3
InformationsquelleAutor Catalyst
Wenn Ihre app hinter einem vertrauenswürdigen proxy (z.B. ein AWS ELB oder ein korrekt konfigurierter nginx), sollte dieser code funktionieren:
Hinweise:
trust proxy
funktioniert für mich 🙂InformationsquelleAutor Jamie McCrindle
Meisten Antworten hier, schlage die erf.Header.host-header.
Den Host-header in HTTP 1.1 erforderlichen, aber es ist eigentlich optional, da der header ist vielleicht nicht wirklich geschickt, die von einem HTTP-client und node/express wird diese Anforderung annehmen.
Könnte man Fragen: welche HTTP-client (e.g: browser) können eine Anfrage zu senden, fehlt dieser header? Das HTTP-Protokoll ist sehr trivial. Sie können basteln einen HTTP-request in ein paar Zeilen code, nicht senden Sie ein host-header, und wenn jedes mal, wenn Sie erhalten ein fehlerhaftes verlangen Sie eine Ausnahme werfen, und je nachdem, wie Sie mit solchen Ausnahmen, dies können nehmen Sie Ihre server down.
So immer überprüfen Sie alle input. Dies ist nicht paranoia, das ich erhalten habe-Anforderungen fehlt der host-header in meinem Dienst.
Auch, nie behandeln URLs als strings. Mit der Knoten-url-Modul, um änderungen an bestimmten teilen einer Zeichenkette. Die Behandlung von URLs als strings genutzt werden kann viele, viele, viele Möglichkeiten. Tun Sie es nicht.
InformationsquelleAutor arboreal84
Können Sie die express-Kraft-https Modul:
npm install --save express-force-https
Schwester-Paket: npmjs.com/package/express-to-https - aber ich habe keine Ahnung, ob es funktioniert/isbetter/etc
InformationsquelleAutor Mateus Dal Bianco
Dies ist, was wir verwenden, und es funktioniert Super!
Oh, ich habe nur versucht ein Beispiel zu geben. Danke Mann!
Geben Sie Beispiele mit einem Gefühl der Verantwortung. Stack-überlauf ist die Telefon Spiel.
dies nicht dazu führen, Endlosschleife?
Nein, weil es nur lauscht auf port 80 und sendet auf port 443. Der einzige Weg eine unendliche Schleife passieren würde, ist, wenn einige Zuhörer auf 443 umleitet zurück zu 80, die nicht in meinem code. Ich hoffe, das macht Sinn. Danke!
InformationsquelleAutor Nick Kotenberg
kann man mit "net" - Modul zum hören für HTTP & HTTPS auf dem gleichen port
Dieser funktioniert nicht wie beschrieben. Ich kann bestätigen, das Problem zu Joe sah.
InformationsquelleAutor luofei614
Ich die vorgeschlagene Lösung von Basarat aber ich muss auch overvrite den Hafen, weil ich 2 verschiedene ports für HTTP-und HTTPS-Protokolle.
Ich auch lieber zu nutzen nicht-standard-port, so zu starten, nodejs ohne root-Rechte.
Ich mag 8080 und 8443 becaouse ich komme aus vielen Jahren der Programmierung auf tomcat.
Meine komplette Datei werden
Dann benutze ich iptable für forwording 80 und 443 traffic auf meine HTTP-und HTTPS-ports.
InformationsquelleAutor Lorenzo Eccher
Dieser arbeitete für mich:
InformationsquelleAutor Shummy1991
Können Sie instanziieren 2 Node.js Server - ein HTTP-und HTTPS -
Können Sie auch definieren, eine setup-Funktion, dass die beiden Server ausgeführt wird, so dass Sie nicht haben, um zu schreiben, viel duplizierten code.
Hier ist die Art, wie ich es gemacht habe: (mit restify.js,, aber sollte funktionieren für express.js oder-Knoten selbst auch)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
InformationsquelleAutor awaage