提问者:小点点

TLSSocket未正确报告Authorization和authorizationError


我正在尝试在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.cashelectroniccash.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'
}

共1个答案

匿名用户

在开始把这个问题打出来之前,我已经为这个问题纠结了一段时间。 在我写出完整的问题后,我想出了答案,所以我决定仍然张贴问题,并提供自己的答案。

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签名的连接报告truenull,而自签名的连接报告falsedepth_zero_self_signed_cert