【问题标题】:Handshake failure in ExpressJS Node app with Let's Encrypt SSL certificates使用 Let's Encrypt SSL 证书的 ExpressJS 节点应用程序中的握手失败
【发布时间】:2019-03-20 07:48:39
【问题描述】:

我在设置节点服务器时遇到问题,让我们加密证书。我正在使用 Express 来创建这样的 https 服务器:

var fs = require('fs');
var app = require('express')();
var https = require('https');

var server = https.createServer({ 
key: 
fs.readFileSync('/etc/letsencrypt/live/mydomain.com/privkey.pem'), 
cert: fs.readFileSync('/etc/letsencrypt/live/mydomain.com/cert.pem'), 
ca: fs.readFileSync('/etc/letsencrypt/live/mydomain.com/chain.pem'), 
requestCert: true, 
rejectUnauthorized: true},app);

app.get("/express", function(request, response){
response.end("Express Response");
});
server.listen(8082);

我想设置 rejectUnauthorized: true 因为我读到禁用它会使客户端/服务器通信容易受到 MITM 攻击。对于客户端,我使用 request 模块发出 https GET 请求,如下所示:

var path = require('path');
var requests = require('request');
var fileSystem = require('fs');

var checkRequestOpts = {
    url: "https://example.com:8082/express",
    agentOtions: {
        ca: fileSystem.readFileSync(__dirname + '/chain1.pem')
    },
    method: 'GET',
    json: true,
    formData: {
        'x': 100,
        'y': 500,
        'z': 97    
    }
};

requests(checkRequestOpts, function(err, sr, rb)
{
    if(err)
        console.log('Error occured' + err);
    else
    {
        console.log('Response: ' + rb);
    }
});

但是,当我运行客户端应用程序时,它会因错误而崩溃

Error occuredError: write EPROTO 140593052855168:error:14094410:SSL 
routines:ssl3_read_bytes:sslv3 alert handshake 
failure:../ssl/record/rec_layer_s3.c:1399:SSL alert number 40

服务器不必向浏览器提供内容,它只需要与客户端节点应用程序一起工作。它在我设置 rejectUnauthorized: false 时有效,但在设置为 true 时无效。 如果有人可以帮助我解决这个问题或提供任何可能的解决方案,我将非常感激。谢谢!

【问题讨论】:

    标签: node.js express ssl ssl-certificate lets-encrypt


    【解决方案1】:

    命名不是你想象的那样。

    基本上,您混淆了cacertkey,这是一个非常常见的错误。

    这里有一些资源可以看看:

    解决方案

    • key 指的是privkey.pem
    • cert 指的是cert.pemchain.pem(又名fullchain.pem)的串联

    您应该忽略ca,因为ca 指的是证书颁发机构,如果您使用企业或军事对等证书验证,您可以在其中放置root.pem

    也试试 Greenlock

    另外,您可能更喜欢使用greenlock-express.js(Node.js/express.js 的 Let's Encrypt / ACME 客户端),这样您一开始就不必做任何手动工作。

    【讨论】:

      【解决方案2】:

      如果您使用自签名 SSL 证书,您应该设置客户端的证书。使用 Let's Encrypt 证书时不需要设置,它已经存储在您的浏览器或系统中。

      【讨论】:

        猜你喜欢
        • 2017-12-13
        • 2017-07-05
        • 2021-11-24
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        • 2021-12-22
        • 2016-11-15
        • 2019-12-06
        相关资源
        最近更新 更多