主机名/ IP与证书的altname不匹配
我正在尝试使用带有自签名证书的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。TLS模块的文档表明,将服务器证书添加到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,而是您要使用的主机名。
这可能是我失败的地方。
我试过了
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
最后两个是我的计算机的本地名称和标准本地名称。
知道我在做什么错吗?
回答:
最近,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) {
//...
});
现在,它将接受任何服务器身份,但仍会加密连接并验证密钥。
,在以前的版本(例如v0.11.14
)中,checkServerIdentity
会返回,boolean
指示服务器的有效性。如果存在问题并且有效,则已将其更改为(之前v4.3.1
)为功能return
(未显示throw
)错误undefined
。
以上是 主机名/ IP与证书的altname不匹配 的全部内容, 来源链接: utcz.com/qa/436076.html