При наличии SSL-ключа и сертификата, как создать службу HTTPS?
При наличии SSL-ключа и сертификата, как создать службу HTTPS?
Ответы:
Я нашел следующий пример.
Это работает для узла 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);
setSecure
устарел. Проверьте это вместо этого stackoverflow.com/questions/5136353/node-js-https-secure-error
В документе 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);
options
сначала https.createServer
, чтобы избежать загадочных ошибок.
openssl genrsa -out key.pem 2048
Нашел этот вопрос, когда гуглил "узел 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);
*.pem
)? Я пытался перейти на эту страницу , но при открытии localhost:8000
в браузере данные не были получены (просто загрузка ...).
openssl
, затем в командной строке cmd введитеopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP не является HTTPS.
Приведенные выше ответы хороши, но с Express и node это будет работать нормально.
Поскольку Express создаст приложение для вас, я пропущу это здесь.
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});
module.exports
? В этом нет необходимости
Минимальная настройка 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);
Используйте Let's Encrypt через 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);
});
Это одна из тех вещей, которые часто проще, если вы не пытаетесь сделать это напрямую через connect или express, но позвольте нативному https
модулю обработать это, а затем использовать это для обслуживания вашего приложения connect / express.
Кроме того, если вы используете server.on('request', app)
вместо передачи приложения при создании сервера, это дает вам возможность передать server
экземпляр какой-то функции инициализатора, которая создает приложение connect / express (если вы хотите использовать websockets через ssl на том же сервере, для пример).
Чтобы включить приложение для прослушивания как 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);
Для полной детализации смотрите документацию
Вы также можете использовать это в архиве с платформой 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
для создания файлов, если вам нужно написать тесты)