我正在尝试在Node中设置到Electrum服务器的TLSSocket
连接。 为此,我希望允许自签名证书,但我确实希望在连接使用自签名证书时通知/log。
为了允许自签名证书,我在连接时使用rejectunauthorized:false
选项。 这和预期的一样有效。 但是,根据节点TLS文档,当授权失败时,连接的套接字应该报告authorization
标志和authorizationerror
。 看来这没有被正确地报告。
下面是演示我的问题的基本示例代码:
const tls = require('tls');
// const host = 'bch.imaginary.cash';
const host = 'electroncash.de'
const port = 50002;
const socket = tls.connect(port, host, { rejectUnauthorized: false });
socket.on('error', console.log);
socket.on('connect', () => {
console.log(`Successfully connected to ${host}:${port}`);
console.log(socket.authorized);
console.log(socket.authorizationError);
})
我在两个不同的服务器上运行了这段代码:bch.imaginary.cash
和electroniccash.de
,前者具有CA签名的证书,后者具有自签名的证书。 在RejectUnAuthorized
设置为false
的情况下运行此代码时,两台主机都会导致以下结果:
Successfully connected to electroncash.de:50002
false
null
我希望CA签名的连接将authorized
报告为true
,并且我希望自签名的连接将authorizationerror
报告为非空。
我还尝试在RejectUnAuthorized
设置为True
的情况下运行相同的代码,在这种情况下,CA签名的连接成功(但仍将Authorized
设置为False
),而自签名连接导致错误:
Error: self signed certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1501:34)
at TLSSocket.emit (events.js:315:20)
at TLSSocket._finishInit (_tls_wrap.js:936:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:710:12) {
code: 'DEPTH_ZERO_SELF_SIGNED_CERT'
}
在开始把这个问题打出来之前,我已经为这个问题纠结了一段时间。 在我写出完整的问题后,我想出了答案,所以我决定仍然张贴问题,并提供自己的答案。
TLSSocket
上的'connect'
事件是从未加密的Net.Socket
继承的。 所以在这种情况下,这是一个错误的事件去倾听。 相反,您应该侦听'secure connect'
事件。 当我们将原始问题中的事件侦听器代码更改为:
socket.on('secureConnect', () => {
console.log(`Successfully connected to ${host}:${port}`);
console.log(socket.authorized);
console.log(socket.authorizationError);
})
结果和预想的完全一样。 换句话说,CA签名的连接报告true
和null
,而自签名的连接报告false
和depth_zero_self_signed_cert
。