【问题标题】:Nodejs TLS with self-signed Certificate Authority具有自签名证书颁发机构的 Nodejs TLS
【发布时间】:2016-03-18 09:50:50
【问题描述】:

背景:


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

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

【问题讨论】:

  • 我从未见过没有过期日期的证书。也许这就是问题所在。要检查的另一件事是您的密钥是否未加密。

标签: node.js ssl client-certificates ca tls1.2


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2018-10-08
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多