Próbuję zmusić HTTPS do pracy na express.js dla węzła i nie mogę tego rozgryźć.
To jest mój app.js
kod.
var express = require('express');
var fs = require('fs');
var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');
var credentials = {key: privateKey, cert: certificate};
var app = express.createServer(credentials);
app.get('/', function(req,res) {
res.send('hello');
});
app.listen(8000);
Po uruchomieniu wydaje się odpowiadać tylko na żądania HTTP.
Napisałem prostą node.js
aplikację HTTPS opartą na wanilii :
var fs = require("fs"),
http = require("https");
var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();
var credentials = {key: privateKey, cert: certificate};
var server = http.createServer(credentials,function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
server.listen(8000);
I kiedy uruchomić tę aplikację, to nie reagować na żądania HTTPS. Zauważ, że nie sądzę, że toString () na wyniku fs ma znaczenie, ponieważ użyłem kombinacji obu i wciąż nie ma es bueno.
EDYTUJ, ABY DODAĆ:
W przypadku systemów produkcyjnych prawdopodobnie lepiej jest używać Nginx lub HAProxy do przesyłania żądań proxy do aplikacji nodejs. Możesz skonfigurować nginx do obsługi żądań ssl i po prostu mówić http do twojego app.js.
EDYTUJ, ABY DODAĆ (4/6/2015)
W przypadku systemów korzystających z AWS lepiej jest używać EC2 Elastic Load Balancers do obsługi terminacji SSL i zezwalać na regularny ruch HTTP do serwerów sieciowych EC2. Aby zwiększyć bezpieczeństwo, skonfiguruj swoją grupę zabezpieczeń tak, aby tylko ELB mógł wysyłać ruch HTTP do instancji EC2, co zapobiegnie uderzeniu zewnętrznego nieszyfrowanego ruchu HTTP w twoje maszyny.
Odpowiedzi:
W express.js (od wersji 3) powinieneś użyć tej składni:
W ten sposób dostarczasz ekspresowe oprogramowanie pośrednie do macierzystego serwera http / https
Jeśli chcesz, aby Twoja aplikacja działała na portach poniżej 1024, musisz użyć
sudo
polecenia (niezalecane) lub odwrotnego proxy (np. Nginx, haproxy).źródło
localhost:80
ale nie działahttps://localhost:443
Najpierw musisz utworzyć pliki selfsigned.key i selfsigned.crt . Przejdź do Utwórz samopodpisany certyfikat SSL lub wykonaj następujące czynności.
Przejdź do terminala i uruchom następującą komendę.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./selfsigned.key -out selfsigned.crt
źródło
Wystąpił podobny problem z uruchomieniem protokołu SSL na porcie innym niż port 443. W moim przypadku miałem certyfikat pakietu, a także certyfikat i klucz. Certyfikat pakietu to plik, który zawiera wiele certyfikatów, węzeł wymaga rozbicia tych certyfikatów na osobne elementy tablicy.
W app.js musisz podać https i odpowiednio utworzyć serwer. Upewnij się także, że port, którego próbujesz użyć, zezwala na ruch przychodzący.
źródło
Łącznie z punktami:
Obsługa HTTP i WS
Konfiguracja SSL
W Sailsjs istnieją dwa sposoby skonfigurowania wszystkich rzeczy, po pierwsze, konfiguracja w folderze config, z którym każdy ma swoje osobne pliki (np. Połączenie z bazą danych dotyczące ustawień leży w obrębie połączeń.js). Drugi to konfiguracja na podstawie podstawowej struktury plików, każdy plik środowiskowy znajduje się w
config/env
folderze, a każdy plik zawiera ustawienia dla konkretnej środowiska.Żagle najpierw szukają w folderze config / env, a następnie czekają na config / * .js
Teraz pozwala na konfigurację ssl
config/local.js
.Lub w production.js
Przekierowanie http / https & ws / wss
Tutaj WS jest Web Socket, a wss reprezentuje Secure Web Socket, ponieważ skonfigurowaliśmy ssl, teraz HTTP i WS oba żądania stają się bezpieczne i przekształcają się odpowiednio w https i wss.
Istnieje wiele źródeł z naszej aplikacji, które otrzymają żądanie, jak każdy post na blogu, post w mediach społecznościowych, ale nasz serwer działa tylko na https, więc gdy każde żądanie pochodzi z http, pojawia się błąd „Nie można dotrzeć do tej witryny” w przeglądarce klienta. I tracimy ruch w naszej witrynie. Musimy więc przekierować żądanie HTTP do https, te same reguły zezwalają na websocket, w przeciwnym razie gniazdo zawiedzie.
Musimy więc uruchomić ten sam serwer na porcie 80 (http) i przekierować wszystkie żądania na port 443 (https). Najpierw kompiluje plik config / bootstrap.js przed podniesieniem serwera. Tutaj możemy uruchomić nasz serwer ekspresowy na porcie 80.
W config / bootstrap.js (Utwórz serwer http i przekieruj wszystkie żądania do https)
źródło
Użyj greenlock-express: bezpłatny SSL, zautomatyzowany HTTPS
Greenlock obsługuje wydawanie i odnawianie certyfikatów (przez Let's Encrypt) i przekierowanie https, po wyjęciu z pudełka.
express-app.js
:server.js
:Screencast
Obejrzyj prezentację QuickStart: https://youtu.be/e8vaR4CEZ5s
Dla Localhost
Odpowiadając na to z wyprzedzeniem, ponieważ jest to częste pytanie uzupełniające:
Nie możesz mieć certyfikatów SSL na localhost. Możesz jednak użyć czegoś takiego jak Telebit który pozwoli ci uruchamiać lokalne aplikacje jako prawdziwe.
Możesz także korzystać z domen prywatnych z Greenlockiem za pośrednictwem wyzwań DNS-01, które są wymienione w README wraz z różnymi wtyczkami, które go obsługują.
Porty niestandardowe (tj. Nr 80/443)
Przeczytaj powyższą notatkę o localhost - nie możesz używać niestandardowych portów w Let's Encrypt.
Możesz jednak ujawnić swoje niestandardowe porty wewnętrzne jako zewnętrzne porty standardowe za pomocą przekierowania portów, sni-route lub użyć czegoś takiego jak Telebit, który wykonuje routing SNI oraz przekierowywanie / przekazywanie portów.
Możesz także użyć wyzwań DNS-01, w którym to przypadku nie będziesz musiał w ogóle ujawniać portów, a także w ten sposób możesz zabezpieczyć domeny w sieciach prywatnych.
źródło
Tak to dla mnie działa. Zastosowane przekierowanie przekieruje również wszystkie normalne http.
źródło
To jest mój działający kod dla express 4.0 .
express 4.0 różni się bardzo od 3.0 i innych.
4.0 masz plik / bin / www, który tutaj dodasz https.
„npm start” to standardowy sposób uruchamiania serwera Express 4.0.
Funkcja readFileSync () powinna używać __nazwa_katalogu pobrać bieżący katalog
while while () użyj ./ odnosi się do bieżącego katalogu.
Najpierw umieść plik private.key i public.cert w folderze / bin, jest to ten sam folder, co plik WWW .
źródło