2

背景:


我正在尝试通过 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。

是什么导致授权客户端无法通过身份验证?

4

1 回答 1

0

你的代码很好。我预计您的证书有问题。没有到期日的事实让我印象深刻。我发现Jamie Nguyen 的这个 OpenSSL 证书颁发机构非常有用。请记住,Nodejs 不支持在一个证书文件中包含多个证书,因此如果您按照指南进行操作,则无需将根 ca 和中间 ca 复制到一个文件中。您必须将它们作为单独的文件条目添加到 ca list 参数中。

Afaik xca 工具是在 openssl 上构建的,因此可能能够将 openssl 中的命令映射到 xca。

于 2016-11-18T12:08:47.710 回答