Jak utworzyć serwer HTTPS w Node.js?

360

Biorąc pod uwagę klucz SSL i certyfikat, w jaki sposób można utworzyć usługę HTTPS?

murvinlai
źródło
2
Użyłem restify.js zamiast express.js , ale pomysł jest taki sam. Oto jak skonfigurowałem serwer node.js, który akceptuje zarówno HTTP, jak i HTTPS qugstart.com/blog/node-js/…
oczekiwanie
2
bez ekspresu iz najnowszą wersją węzła - spójrz tutaj: stackoverflow.com/a/21809393/388026
pkyeck
1
Co się stało z tym pytaniem? Odpowiedzi sugerują, że pierwotnie chodziło o express.js.
doug65536
utworzenie prawidłowego, samopodpisanego certyfikatu SSL i uruchomienie serwera HTTPS jest banalne - wystarczy kilka kroków
Lloyd
3
Jest trochę późno, ale jeśli ktoś potrzebuje kompletnego samouczka nodejs https, może znaleźć tutaj: programmerblog.net/nodejs-https-server
Jason W

Odpowiedzi:

150

Znalazłem następujący przykład.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

Działa to dla węzła v0.1.94 - v0.3.1. server.setSecure()jest usuwany w nowszych wersjach węzła.

Bezpośrednio z tego źródła:

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

var handler = function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
};

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);
hvgotcodes
źródło
3
setSecurejest przestarzałe. Sprawdź to zamiast tego stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle
7
Zobacz oficjalną wyraźną odpowiedź poniżej autorstwa @Jacob Marble.
clayzermk1
21
Ten przykład już nie działa, ponieważ implementacja HTTPS została ponownie wykonana w Node.JS 0.4. Zobacz odpowiednie dokumenty na nodejs.org. stackoverflow.com/questions/5136353/…
scottyab
10
Ta odpowiedź jest bardzo stara i już nie działa. Proszę zobaczyć odpowiedź pkyeck poniżej lub przejść do: nodejs.org/api/https.html
Jay Sheth
2
Również link jest zerwany
TlonXP
484

Dokument Express API określa to dość wyraźnie.

Dodatkowo ta odpowiedź zawiera instrukcje tworzenia certyfikatu z podpisem własnym.

Dodałem kilka komentarzy i fragmentu z dokumentacji HTTPS Node.js :

var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
Jacob Marble
źródło
49
Miło, właśnie miałem to opublikować. Dziękuję Ci. Dodatkowo uważam, że ten artykuł jest pomocny w generowaniu samopodpisanego certyfikatu.
clayzermk1
1
Upewnij się, że umieściłeś na optionspierwszym miejscu https.createServer, aby uniknąć tajemniczych błędów.
wberry
1
Konfiguruję prawie identyczny port 8888 serwera https i nie jestem pewien, jak zmienić trasy. kiedy uruchamiam curl curl --insecure localhost: 8888 curl: (35) Nieznany błąd protokołu SSL w połączeniu z localhost: 8888 jaki jest błąd przychodzący i jak go obejść. Kiedy wpisuję localhost: 8888 w przeglądarce, zawiesza się i https: / localhost: 8888 podaje błąd SSL
reza
2
@Costa możesz przekierowywać użytkowników z http na https za pomocą express-force-ssl lub ręcznie napisanego oprogramowania pośredniego - to całkiem proste
floatdrop
1
@NathanMcKaskle Możesz wyłączyć hasło: Sprawdź ten przewodnik, ale jeśli używasz systemu macOS, upewnij się, że wygenerowana długość klucza wynosi co najmniej 2048:openssl genrsa -out key.pem 2048
sakisk
87

Znalazłem to pytanie podczas przeglądania „węzła https”, ale przykład w zaakceptowanej odpowiedzi jest bardzo stary - wzięty z dokumentacji aktualnej wersji (v0.10) węzła, powinien wyglądać następująco:

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);
dziobak
źródło
Działa jak urok. Ta informacja przydała się bardzo, gdy uruchomiłem narzędzie node.js (PDFJS) na aplikacji PHP, która została niedawno zmuszona do uruchomienia przez https. Iframe był bardzo niezadowolony z załadowania mojej aplikacji node.js na alternatywny port inny niż https.
lewsid
2
Wygląda to dobrze, ale jak mogę wygenerować wymagane tam pliki ( *.pem)? Próbowałem śledzić tę stronę , ale podczas otwierania localhost:8000w przeglądarce nie otrzymano żadnych danych (tylko ładowanie ...).
Ionică Bizău
7
@ IonicăBizău, aby wygenerować klucze, zainstaluj openssl, a następnie w wierszu polecenia cmd wpiszopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
środę
2
@ IonicăBizău, musisz bezpośrednio przejść do https://localhost:8080. HTTP NIE JEST HTTPS.
Florian Wendelborn,
Czy można utworzyć serwer https z folderem? Możesz więc umieścić w nim plik i uzyskać do niego dostęp, np. Localhost: 81 / main.js
FrenkyB
47

Powyższe odpowiedzi są dobre, ale w przypadku Express i node to będzie działać poprawnie.

Ponieważ ekspresowe tworzenie aplikacji dla Ciebie, pomiń to tutaj.

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});
nu1silva
źródło
Jest to technicznie bardziej poprawna odpowiedź, ponieważ pytanie brzmiało, jak to zrobić za pomocą Express.js
Kato,
12
Wydaje się, że jest to przestarzałe, ponieważ „aplikacje nie dziedziczą już po http.Server”
Merlyn Morgan-Graham
2
Dlaczego ustawiasz module.exports? Nie ma takiej potrzeby
Matej
1
@matejkramny, prawdopodobnie dlatego, że ułatwia testowanie.
Justin
21

Minimalna konfiguracja serwera HTTPS w Node.js wyglądałaby mniej więcej tak:

var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);

Jeśli chcesz również obsługiwać żądania HTTP, musisz wprowadzić tylko małą modyfikację:

var http = require('http');
var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
John Slegers
źródło
18

Aktualizacja

Użyj Let's Encrypt poprzez Greenlock.js

Oryginalny post

Zauważyłem, że żadna z tych odpowiedzi nie pokazuje, że dodanie pośredniego głównego urzędu certyfikacji do łańcucha, oto kilka przykładów konfiguracji zerowej, z którymi można się bawić, aby zobaczyć, że:

Skrawek:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

Jest to jedna z tych rzeczy, które często są łatwiejsze, jeśli nie próbujesz zrobić tego bezpośrednio przez connect lub express, ale pozwól natywnemu httpsmodułowi to obsłużyć, a następnie użyj tego do obsługi aplikacji connect / express.

Ponadto, jeśli używasz server.on('request', app)zamiast przekazywania aplikacji podczas tworzenia serwera, daje to możliwość przekazania serverinstancji do jakiejś funkcji inicjalizującej, która tworzy aplikację Connect / Express (jeśli chcesz zrobić WebSockets przez SSL na tym samym serwerze, dla przykład).

CoolAJ86
źródło
To miłe wytłumaczenie, ale podany link w sekcji aktualizacji jest zepsuty (daje błąd 500)
Chucky,
8

Aby aplikacja mogła nasłuchiwać zarówno na portach, jak httpi httpsna portach, 80i 443odpowiednio wykonaj następujące czynności

Utwórz aplikację ekspresową:

var express = require('express');
var app = express();

Aplikacja zwracana przez express()to funkcja JavaScript. Może być przekazany do serwerów HTTP Node jako callback do obsługi żądań. Ułatwia to dostarczanie wersji aplikacji HTTP i HTTPS przy użyciu tej samej bazy kodu.

Możesz to zrobić w następujący sposób:

var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
var app = express();

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

Aby uzyskać szczegółowe informacje, zobacz dokument

cmd
źródło
0

Możesz użyć również zarchiwizować to w ramach Fastify:

const { readFileSync } = require('fs')
const Fastify = require('fastify')

const fastify = Fastify({
  https: {
    key: readFileSync('./test/asset/server.key'),
    cert: readFileSync('./test/asset/server.cert')
  },
  logger: { level: 'debug' }
})

fastify.listen(8080)

(i uruchom, openssl req -nodes -new -x509 -keyout server.key -out server.certaby utworzyć pliki, jeśli chcesz napisać testy)

Manuel Spigolon
źródło
-3
  1. Pobierz plik rar dla openssl skonfigurowany tutaj: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Po prostu skopiuj folder na dysk c.
  3. Utwórz plik openssl.cnf i pobierz jego zawartość z: http://web.mit.edu/crypto/openssl.cnf openssl.cnf można umieścić w dowolnym miejscu, ale ścieżka powinna być poprawna, gdy podamy wiersz polecenia.
  4. Otwórz polecenie propmt i ustaw openssl.cnf ścieżka C: \ set OPENSSL_CONF = d: /openssl.cnf 5. Uruchom to w cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Następnie uruchom OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Następnie poprosi o podanie fraz: wpisz 4 do 11 znaków jako hasło do certyfikatu
  7. Następnie uruchom to openssl> req -new -key server.enc.key -out server.csr
  8. Następnie poprosi o podanie niektórych szczegółów, takich jak nazwa kodu kraju itp., Wypełnij go swobodnie. 10 Następnie uruchom openssl> rsa -in server.enc.key -out server.key
  9. Uruchom ten OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt, a następnie użyj poprzedniego kodu, który jest na przepełnieniu stosu Dzięki
Er Shubham Patidar
źródło
to jest OT . Pytanie PO jest jasne. Certyfikaty są już wydane.
Martin Schneider,
-6
var path = require('path');
var express = require('express');

var app = express();

var staticPath = path.join(__dirname, '/public');
app.use(express.static(staticPath));

app.listen(8070, function() {
  console.log('Server started at port 8070');
});
Irfan Shah
źródło
3
Powinieneś podać więcej wyjaśnień wzdłuż kodu.
Benoît Latinier