背景:
我正在尝试通过 TLS 在服务器和一个(应该可以是多个 - 因此需要 CA)客户端之间进行通信。
每个节点都有一个使用通用 CA 签名的证书。CA 又是自签名的。
每个节点的私钥导出为key.pem
. 每个节点的证书导出为certificate.crt
. CA 证书导出为ca.crt
. 证书没有捆绑,只是按原样导出。
服务器使用以下设置:
var tls = require("tls");
var fs = require("fs");
var options = {
key: fs.readFileSync("keys/key.pem", "utf8"),
cert: fs.readFileSync("keys/certificate.crt", "utf8"),
requestCert: true,
rejectUnauthorized: true,
ca: [fs.readFileSync('keys/ca.crt')]
}
var server = tls.createServer(options, function(res) {
console.log("Client connected");
console.log('Client connected',
res.authorized ? 'authorized' : 'unauthorized');
res.write("Hello World!");
res.setEncoding("utf8");
res.pipe(res);
}).listen(3000);
客户端使用以下设置:
var tls = require("tls");
var fs = require("fs");
var options = {
key: fs.readFileSync("keys/key.pem", "utf8"),
cert: fs.readFileSync("keys/certificate.crt", "utf8"),
requestCert: true,
rejectUnauthorized: true,
ca: [fs.readFileSync('keys/ca.crt')]
}
var client = tls.connect(3000, options, function(){
console.log("Connected to server");
console.log(client.authorized ? "Authorized" : "Not authorized");
});
client.on("data", function(data){
console.log("Received from server", data);
client.end();
});
关于密钥/证书的注意事项:
密钥和证书是使用 openssl GUI / manager XCA 生成的。
问题:
如您所见,我正在使用显式客户端证书身份验证,并且我想禁止任何未经允许的连接。
这样做的问题是客户端无法连接,即使所有证书都来自同一个 CA。
我从服务器(当客户端连接时)和客户端(当它连接时)得到的错误是:
Error: socket hang up, code: ECONNRESET
如果我禁用rejectUnauthorized
客户端可以连接,但res.authorized
返回 false。
是什么导致授权客户端无法通过身份验证?