Как создать сервер HTTPS в Node.js?

Учитывая ключ SSL и сертификат, как создать HTTPS-сервис?

Ответ 1

Я нашел следующий пример.

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

Ответ 2

Express API doc довольно ясно говорит об этом.

Дополнительно этот ответ дает шаги для создания самозаверяющего сертификата.

Я добавил несколько комментариев и фрагмент из документации Node.js HTTPS:

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

Ответ 3

Нашел этот вопрос во время googling "node https", но пример в принятом ответе очень старый - взято из docs текущей версии (v0.10) node, она должна выглядеть примерно так:

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

Ответ 4

Вышеуказанные ответы хороши, но с помощью 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});

Ответ 5

Минимальная настройка для 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);

Ответ 6

Обновить

Используйте Let Encrypt через Greenlock.js

Оригинальный пост

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

Snippet:

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

Это одна из тех вещей, которые часто проще, если вы не пытаетесь сделать это напрямую через connect или express, но позвольте встроенному модулю https обработать его, а затем использовать его для обслуживания вашего приложения connect/express.

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

Ответ 7

Чтобы ваше приложение могло прослушивать как http и https на портах 80 и 443 соответственно, выполните следующие действия:

Создайте экспресс-приложение:

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

Приложение, возвращаемое функцией express() является функцией JavaScript. Его можно передать HTTP-серверам Nodes в качестве обратного вызова для обработки запросов. Это упрощает предоставление как 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);

Подробные сведения см. В документе

Ответ 8

Вы также можете использовать это для архивации с платформой 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)

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

Ответ 9

  • Загрузите файл rar для openssl, созданный здесь: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  • Просто скопируйте свою папку на диск c.
  • Создайте файл openssl.cnf и загрузите их содержимое из: http://web.mit.edu/crypto/openssl.cnf openssl.cnf может быть помещен куда угодно, но путь shoud будет правильным, когда мы дадим в командной строке.
  • Откройте команду propmt и установите путь openssl.cnf C:\set OPENSSL_CONF = d:/openssl.cnf 5. Запустите это в cmd: C:\openssl-0.9.8r-i386-win32-rev2 > openssl.exe
  • Затем запустите OpenSSL > genrsa -des3 -out server.enc.key 1024
  • Затем он попросит передать фразы: введите от 4 до 11 символов в качестве пароля для сертификата
  • Затем запустите этот Openssl > req -new -key server.enc.key -out server.csr
  • Затем он будет запрашивать некоторые данные, такие как название страны кода и т.д. Заполните его свободно. 10. Затем запустите Openssl > rsa -in server.enc.key -out server.key
  • Запустите этот OpenSSL > x509 -req -days 365 -in server.csr -signkey server.key -out server.crt, затем используйте предыдущий код, который находится на переполнении стека Благодаря

Ответ 10

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