在设置节点服务器的加密证书时遇到问题。我正在使用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时,它不起作用。 如果有人可以帮助我解决这个问题或提供任何可能的解决方案,我将非常感谢。谢谢!
答案 0 :(得分:1)
基本上,您将ca
,cert
和key
混合在一起,这是一个非常常见的错误。
这里有一些资源可供参考:
key
是指privkey.pem
cert
是指cert.pem
和chain.pem
(又称fullchain.pem
)的串联 您应该忽略ca
,因为ca
指的是证书颁发机构,如果您使用的是企业证书或军事对等证书验证,则应该放在root.pem
处。
rejectUnauthorized: true
正在禁用安全检查。您不想要这个。您需要rejectUnauthorized: false
(默认设置)。requestCert: true
仅用于对等证书验证。您不想要这个。
此外,您可能更喜欢使用greenlock-express.js(让我们为Node.js / express.js使用Encrypt / ACME客户端),这样一来您就不必进行任何手动工作。
答案 1 :(得分:0)
如果使用自签名SSL证书,则应设置客户端的证书。使用“让我们加密”证书时不需要进行设置,因为它已经存储在您的浏览器或系统中。