给定一个SSL密钥和证书,如何创建HTTPS服务?
给定一个SSL密钥和证书,如何创建HTTPS服务?
Answers:
我发现以下示例。
这适用于节点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
该快递API文档相当明确阐述了这一点。
此外,此答案还提供了创建自签名证书的步骤。
我已经从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);
options
首先输入https.createServer
,以免发生密码错误。
在搜寻“ node https”时发现了这个问题,但是接受的答案中的例子很旧-取自当前(v0.10)版本的docs,它看起来应该像这样:
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);
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
?不需要
Node.js中HTTPS服务器的最小设置如下所示:
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);
通过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
模块处理它然后使用它为您提供连接/ Express应用程序服务。
另外,如果您server.on('request', app)
在创建服务器时使用了传递应用程序的方式,而不是通过应用程序,那么它就有机会将server
实例传递给创建连接器/快速应用程序的某些初始化函数(如果要通过同一服务器上的ssl 进行websockets,例)。
为了使您的应用程序监听双方http
和https
有关港口80
和443
分别,做到以下几点
创建一个快速应用程序:
var express = require('express');
var app = express();
返回的应用express()
是JavaScript函数。可以将其作为处理请求的回调传递给Node的HTTP服务器。这使得使用相同的代码库轻松提供应用程序的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
如果需要编写测试,请运行以创建文件)