繁体   English   中英

在Express服务器上启用HTTPS

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM