[英]Enabling HTTPS on an express server
我正在尝试将我的快速服务器配置为使用HTTPS,但遇到一些问题。 我按照文档设置了HTTPS服务器,但仍然遇到一些错误。
这是我的app.js
var express = require('express'); var app = express(); var server = require('https').createServer(options, app); var io = require('socket.io')(server); var port = process.env.PORT || 3000; var fs = require('fs'); var options = { key: fs.readFileSync('/test/key.pem'), cert: fs.readFileSync('/test/cert.pem') }; server.listen(port, function () { console.log('Server listening at port %d', port); });
启动服务器时遇到
https.js:32 if (process.features.tls_npn && !opts.NPNProtocols) { ^ TypeError: Cannot read property 'NPNProtocols' of undefined at new Server (https.js:32:40) at Object.exports.createServer (https.js:56:10)
因此,我试图在选项中定义NPNProtocols,但这没有用。 有人在这里有指针吗? 谢谢。
尝试一次,我认为您应该拥有.crt格式的证书。 并且您将需要tls模块。
var sslOptions = {
key: fs.readFileSync('public/server.key'),
cert: fs.readFileSync('public/server.crt')
};
tls.createServer(sslOptions, function (cleartextStream) {
var cleartextRequest = net.connect({
port: port,
host: serverStr
}, function () {
cleartextStream.pipe(cleartextRequest);
cleartextRequest.pipe(cleartextStream);
});
}).listen(443);
port是您的http port。 sercerStr是您的服务器地址。
IMO,问题不在于密钥的扩展,而是所使用的ssl配置。 将https
节点模块与ca, cert, and key
正确ssl选项一起使用ca, cert, and key
以启用带有express的https。
// server/index.js
const express = require('express');
const fse = require('fs-extra');
const helmet = require('helmet');
const https = require('https');
const path = require('path');
// path to cert files
const paths = {
certFile: '/path/to/cert.pem',
chainFile: '/path/to/fullchain.pem',
privateFile: '/path/to/privkey.pem',
};
/* Express implementation (ignore) */
const app = express();
app.use(helmet());
app.use(express.static(path.join(__dirname, '..')));
app.get('/', (request, response) => {
response.sendFile(path.join('index.html'));
});
// setup https
const setupHttps = () => {
const promises = [
fse.readFile(paths.chainFile),
fse.readFile(paths.privateFile),
fse.readFile(paths.certFile),
];
return Promise
.all(promises)
.then(data => {
const [ chainData, privateData, certData ] = data;
const options = {
ca: chainData.toString('utf-8'),
cert: certData.toString('utf-8'),
key: privateData.toString('utf-8'),
};
return https.createServer(
options,
app
).listen(443);
})
.catch(err => console.log(err));
};
return setupHttps();
编辑:我使用helmetjs来获得带有HTTP标头的更好的安全性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.