【问题标题】:Enabling HTTPS on an express server在快速服务器上启用 HTTPS
【发布时间】:2015-12-11 04:25:42
【问题描述】:

我正在尝试将我的快速服务器配置为使用 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,但没有奏效。有人在这里有任何指示吗? 谢谢。

【问题讨论】:

  • 您需要在使用.createServer() 行之前初始化您的options 对象。将其移到createServer() 上方。

标签: javascript node.js express https


【解决方案1】:

尝试一次,我认为您应该拥有 .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 端口。 sercerStr 是你的服务器地址。

【讨论】:

    【解决方案2】:

    IMO,问题不在于密钥的扩展,而在于使用的 ssl 配置。使用 https 节点模块和 ca, cert, and key 的正确 ssl 选项来启用 https with express。

    // 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 标头的安全性。

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2015-06-11
      • 2020-12-15
      • 2023-03-29
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多