Як створити сервер HTTPS в Node.js?


360

Як надавати ключ SSL та сертифікат, як створювати послугу HTTPS?


2
Я використовував restify.js замість express.js , але ідея та ж. Ось як я налаштував сервер node.js, який приймає і HTTP, і HTTPS qugstart.com/blog/node-js/…
пробувати

2
без явного і з новітньою версією вузла - дивіться тут: stackoverflow.com/a/21809393/388026
pkyeck

1
Що сталося з цим питанням? Відповіді означають, що спочатку мова йшла про express.js.
doug65536

банально створити дійсний, самопідписаний сертифікат SSL та запустити сервер HTTPS, всього за кілька кроків
Ллойд

3
Це трохи пізно, але якщо комусь потрібен повний підручник https https, можна знайти тут: programmerblog.net/nodejs-https-server
Jason W

Відповіді:


150

Я знайшов наступний приклад.

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

Це працює для вузла v0.1.94 - v0.3.1. server.setSecure()видаляється в новіших версіях вузла.

Безпосередньо з цього джерела:

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
setSecureзастаріло. Перевірте це замість stackoverflow.com/questions/5136353/node-js-https-secure-error
Битва Ларрі

7
Дивіться офіційну експрес-відповідь нижче від @Jacob Marble.
clayzermk1

21
Цей зразок більше не працює, оскільки реалізація HTTPS була повторно виконана в Node.JS 0.4. Дивіться відповідні документи на nodejs.org. stackoverflow.com/questions/5136353 / ...
scottyab

10
Ця відповідь дуже стара і більше не працює. Перегляньте відповідь pkyeck нижче або перейдіть за адресою
Джей Шет

2
Також посилання порушено
TlonXP

484

Документ Express API чітко пояснює це.

Крім того, ця відповідь дає кроки для створення сертифіката, який підписав самостійно.

Я додав декілька коментарів та фрагмент із документації 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
Приємно, якраз збирався опублікувати це сам. Дякую. Крім того, я вважаю цю статтю корисною для створення сертифіката, який підписав самостійно.
clayzermk1

1
Переконайтеся, що ви ставите optionsпершими https.createServer, щоб уникнути криптичних помилок.
wberry

1
Я встановлюю майже однаковий порт сервера https 8888 і не знаю, як змінити маршрути. коли я запускаю curl curl - незахищений localhost: 8888 curl: (35) Невідома помилка протоколу SSL у зв’язку з localhost: 8888 від чого виникає помилка та як її обійти. Коли я набираю localhost: 8888 у браузері, він зависає та https: / localhost: 8888 видає помилку SSL
reza

2
@Costa ви можете перенаправляти користувачів з http на https за допомогою express-force-sll або рукописного проміжного програмного забезпечення - це досить просто
floatdrop

1
@NathanMcKaskle Ви можете відключити пароль. Перевірте це керівництво, але якщо ви використовуєте macOS, переконайтеся, що згенерована довжина ключа не менше 2048 року:openssl genrsa -out key.pem 2048
sakisk

87

Знайшов це питання під час googling "node https", але приклад у прийнятій відповіді дуже старий - взято з документів поточної (v0.10) версії вузла, він повинен виглядати так:

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

Працював як шарм. Ця інформація була дуже зручною, коли я запускаю інструмент node.js (PDFJS) поверх додатку PHP, який нещодавно був змушений працювати над https. Iframe був дуже незадоволений завантаженням мого додатка node.js на інший порт, який не є https.
lewsid

2
Це виглядає добре, але як я можу генерувати потрібні вам файли ( *.pem)? Я спробував дотримуватися цієї сторінки , але при відкритті localhost:8000в браузері ніяких даних не надходить (просто завантажується ...).
Ionică Bizău

7
@ IonicăBizău, для генерації ключів встановіть openssl, а потім у cmd-рядок введітьopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
середина

2
@ IonicăBizău вам потрібно безпосередньо перейти https://localhost:8080. HTTP НЕ HTTPS.
Флоріан Вендельборн

Чи можливо створити https-сервер з папкою? Таким чином, ви можете помістити в нього файл і отримати доступ до цього файлу, як localhost: 81 / main.js
FrenkyB

47

Наведені вище відповіді хороші, але за допомогою Express і node це буде добре.

Оскільки експрес створити додаток для вас, я пропущу це тут.

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

Це технічно більш правильна відповідь, оскільки питання полягало в тому, як це зробити з Express.js
Kato

12
Це здається застарілим, оскільки "додатки більше не успадковують з http.Server"
Мерлін Морган-Грем

2
Чому ви налаштовуєте module.exports? У цьому немає потреби
Матей

1
@matejkramny, ймовірно, тому, що це спрощує тестування.
Джастін

21

Мінімальна настройка для HTTPS-сервера в Node.js була б приблизно такою:

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

Якщо ви також хочете підтримувати http-запити, вам потрібно зробити лише цю невелику модифікацію:

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

Оновлення

Використовуйте давайте шифрувати через Greenlock.js

Оригінальна публікація

Я помітив, що жоден з цих відповідей не показує, що додаючи проміжний кореневий центр CA до ланцюга, ось кілька прикладів з нульовою конфігурацією, з якими можна грати, щоб побачити, що:

Фрагмент:

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

Це одне з тих речей, яке часто простіше, якщо ви не намагаєтеся зробити це безпосередньо через підключення або експрес, але дозвольте рідному httpsмодулю обробляти це, а потім використовувати це, щоб служити вам для підключення / експрес-програми.

Крім того, якщо ви використовуєте server.on('request', app)замість передачі програми під час створення сервера, це дає вам можливість передати serverекземпляр до деякої функції ініціалізатора, яка створює додаток connect / express (якщо ви хочете робити веб-розетки через ssl на одному сервері, для приклад).


Це гарне пояснення , але, що додається посилання в розділі оновлень, розірвано (дає помилку 500)
Чакі

8

Щоб включити додаток для прослуховування як httpі httpsна порти 80і , 443відповідно, виконайте наступні дії

Створіть експрес-додаток:

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

Додаток, повернутий express()функцією JavaScript. Він може бути переданий на HTTP-сервери Node як зворотний дзвінок для обробки запитів. Це полегшує надання як HTTP, так і HTTPS версій вашої програми, використовуючи одну і ту ж базу коду.

Можна зробити так:

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

Детальну інформацію див. У док


0

Ви також можете скористатись цим архівом за допомогою Fastify Framework:

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)

(і запустіть, openssl req -nodes -new -x509 -keyout server.key -out server.certщоб створити файли, якщо вам потрібно написати тести)


-3
  1. Завантажте rar-файл для налаштування openssl звідси: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Просто скопіюйте папку на диск.
  3. Створіть файл openssl.cnf та завантажте їх вміст з: http://web.mit.edu/crypto/openssl.cnf openssl.cnf можна поставити будь-де, але шлях повинен бути правильним, коли ми даємо командний рядок.
  4. Відкрити команду propmt і встановити шлях openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5.Запустіть це в cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Потім запустіть OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Потім він попросить пропустити фрази: введіть 4 - 11 символів як пароль для сертифіката
  7. Потім запустіть цей Openssl> req -new -key server.enc.key -out server.csr
  8. Тоді він запитає деякі деталі, наприклад, ім'я держави, код держави тощо. 10. Потім запустіть Openssl> rsa -in server.enc.key -out server.key
  9. Запустіть цей OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt, а потім використовуйте попередній код, який знаходиться у переповненні стека Спасибі

це ОТ . Питання ОП зрозуміло. Сертифікати вже надані.
Мартін Шнайдер

-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
Вам слід надати ще одне пояснення уздовж коду.
Бенуо Латьєн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.