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?


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);

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);

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);

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

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);

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).


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


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)


-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

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');
});

3
Powinieneś podać więcej wyjaśnień wzdłuż kodu.
— Benoît Latinier
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.