【问题标题】:How do I setup a SSL certificate for an express.js server?如何为 express.js 服务器设置 SSL 证书?
【发布时间】:2021-06-23 10:55:04
【问题描述】:

以前,在旧版本的 express 中,我可以这样做:

express.createServer({key:'keyFile', cert:'certFile'});

但是,在较新版本的 express 中,这不再有效:

var app = express();

我应该打电话给app.use() 来设置证书吗?如果有怎么办?

【问题讨论】:

    标签: node.js express ssl-certificate


    【解决方案1】:

    参见the Express docsNode docs for https.createServer(这是 express 推荐使用的):

    var privateKey = fs.readFileSync( 'privatekey.pem' );
    var certificate = fs.readFileSync( 'certificate.pem' );
    
    https.createServer({
        key: privateKey,
        cert: certificate
    }, app).listen(port);
    

    createServer 的其他选项位于:http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

    【讨论】:

    • Hmmm from node: https.createServer(options, [requestListener]) 所以通过应用程序可以吗?那个应用程序不是一个“对象”吗...
    • 'app' 的函数签名是什么?我尝试在 github 上查找 express 但我看不到它需要 (req, res)
    • 看一下createServerconnect.js中的定义(express只是从connect继承这个)。您会看到它返回了一个具有正确签名的函数。 connect() 只是 connect.createServer() 的别名,因此 express() 也是如此(它可能进行了一些额外的初始化,但结果仍然是一个适合用作请求处理程序的函数)。
    • @Qix - 在 OP 示例中,定义了 app。这个答案令人满意。
    • 是否有任何大纲如何获取 .pem 文件?我有两个来自我的证书提供者的 .crt 文件。
    【解决方案2】:

    我能够让 SSL 使用以下样板代码:

    var fs = require('fs'),
        http = require('http'),
        https = require('https'),
        express = require('express');
    
    var port = 8000;
    
    var options = {
        key: fs.readFileSync('./ssl/privatekey.pem'),
        cert: fs.readFileSync('./ssl/certificate.pem'),
    };
    
    var app = express();
    
    var server = https.createServer(options, app).listen(port, function(){
      console.log("Express server listening on port " + port);
    });
    
    app.get('/', function (req, res) {
        res.writeHead(200);
        res.end("hello world\n");
    });
    

    【讨论】:

    • 您如何在浏览器上实际看到 hello world? 127.0.0.1:8000 给我一个错误 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL 协议错误。
    • 投票过早。我得到 - 错误:addListener 只接受 Function 的实例
    • 记住那是很久以前写的。这可能不再适用于较新版本的 Express 或 Node.js
    • 这为时已晚,但 SSL_PROTOCOL_ERROR 可能是由于您使用的是 http:// 造成的。它应该是 https://
    【解决方案3】:

    这是我的 工作代码,用于 express 4.0

    express 4.0 与 3.0 和其他版本非常不同。

    4.0 你有 /bin/www 文件,你要在这里添加 https。

    “npm start”是启动 express 4.0 服务器的标准方式。

    readFileSync() 函数应该使用 __dirname 获取当前目录

    而 require() 使用 ./ 引用当前目录。

    首先将 private.key 和 public.cert 文件放在 /bin 文件夹下, 它与 WWW 文件位于同一文件夹

    找不到这样的目录错误:

      key: fs.readFileSync('../private.key'),
    
      cert: fs.readFileSync('../public.cert')
    

    错误,找不到这样的目录

      key: fs.readFileSync('./private.key'),
    
      cert: fs.readFileSync('./public.cert')
    

    工作代码应该是

    key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
    
    cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
    

    完整的 https 代码是:

    const https = require('https');
    const fs = require('fs');
    
    // readFileSync function must use __dirname get current directory
    // require use ./ refer to current directory.
    
    const options = {
       key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
      cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
    };
    
    
     // Create HTTPs server.
    
     var server = https.createServer(options, app);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2020-12-17
      • 2010-09-09
      • 2013-12-10
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多