gpt4 book ai didi

node.js - 主机名/IP 与证书的替代名称不匹配

转载 作者:IT老高 更新时间:2023-10-28 22:10:24 28 4
gpt4 key购买 nike

我正在尝试使用带有自签名证书的 Node.js 0.8.8 创建 TLS 服务器/客户端设置。

基本的服务器代码如下所示

var tlsServer = tls.createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
// [...]
});
tlsServer.listen(3000);

现在,当我尝试连接到此服务器时,我使用以下代码:

var connection = tls.connect({
host: '192.168.178.31',
port: 3000,

rejectUnauthorized: true,
ca: [ fs.readFileSync('server-cert.pem') ]
}, function () {
console.log(connection.authorized);
console.log(connection.authorizationError);
console.log(connection.getPeerCertificate());
});

如果我删除该行

ca: [ fs.readFileSync('server-cert.pem') ]

从客户端代码,Node.js 抛出一个错误,告诉我 DEPTH_ZERO_SELF_SIGNED_CERT。据我了解,这是因为它是一个自签名证书,并且没有其他方信任该证书。

如果我删除

rejectUnauthorized: true,

同样,错误消失了 - 但 connection.authorized 等于 false 这实际上意味着我的连接未加密。无论如何,使用 getPeerCertificate() 我可以访问服务器发送的证书。由于我想强制执行加密连接,我知道我可能不会删除此行。

现在我读到我可以使用 ca 属性来指定我希望 Node.js 信任的任何 CA。 documentation of the TLS module意味着将服务器证书添加到 ca 数组就足够了,然后一切都应该没问题。

如果我这样做,这个错误就会消失,但我会得到一个新的:

Hostname/IP doesn't match certificate's altnames

对我来说,这意味着 CA 现在基本上是受信任的,因此现在没关系,但证书是为我使用的主机之外的另一台主机制作的。

我使用

创建了证书
$ openssl genrsa -out server-key.pem 2048
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem

正如文档所暗示的那样。在创建 CSR 时,我会被问到一些常见的问题,例如国家、州、... 和通用名称 (CN)。正如您在“网络上”被告知的 SSL 证书一样,您确实提供您的 CN 名称,而是您想要使用的主机名。

这可能是我失败的地方。

我试过了

  • 本地主机
  • 192.168.178.31
  • eisbaer
  • eisbaer.fritz.box

最后两个是我的机器的本地名称和完全限定的本地名称。

知道我在这里做错了什么吗?

最佳答案

最近有一个addition to node.js它允许使用自定义函数覆盖主机名检查。它已添加到 v0.11.14,并将在下一个稳定版本 (0.12) 中提供。现在您可以执行以下操作:

var options = {
host: '192.168.178.31',
port: 3000,
ca: [ fs.readFileSync('server-cert.pem') ],
checkServerIdentity: function (host, cert) {
return undefined;
}
};
options.agent = new https.Agent(options);
var req = https.request(options, function (res) {
//...
});

现在这将接受任何服务器身份,但仍会加密连接并验证 key 。

注意,在以前的版本(例如 v0.11.14 )中,checkServerIdentity是返回 boolean表明服务器的有效性。已更改(在 v4.3.1 之前)为函数 return ing(不是 throw ing)如果有问题和 undefined 会出错。如果有它是有效的。

关于node.js - 主机名/IP 与证书的替代名称不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088787/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com