让我们加密SSL证书的ExpressJS Node应用程序中的握手失败

时间:2018-10-15 20:24:20

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

在设置节点服务器的加密证书时遇到问题。我正在使用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时,它不起作用。 如果有人可以帮助我解决这个问题或提供任何可能的解决方案,我将非常感谢。谢谢!

2 个答案:

答案 0 :(得分:1)

命名不是您想的那样。

基本上,您将cacertkey混合在一起,这是一个非常常见的错误。

这里有一些资源可供参考:

解决方案

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

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

也尝试格林洛克(Greenlock)

此外,您可能更喜欢使用greenlock-express.js(让我们为Node.js / express.js使用Encrypt / ACME客户端),这样一来您就不必进行任何手动工作。

答案 1 :(得分:0)

如果使用自签名SSL证书,则应设置客户端的证书。使用“让我们加密”证书时不需要进行设置,因为它已经存储在您的浏览器或系统中。