Учитывая ключ SSL и сертификат, как создать HTTPS-сервис?
Как создать сервер HTTPS в Node.js?
Ответ 1
Я нашел следующий пример.
Это работает для узла 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 в цепочку, вот несколько примеров с нулевой конфигурацией, с которыми можно поиграть:
- https://github.com/coolaj86/nodejs-ssl-example
- http://blog.coolaj86.com/articles/how-to-create-a-csr-for-https-tls-ssl-rsa-pems/
- https://github.com/coolaj86/nodejs-self-signed-certificate-example
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');
});