3

我在节点 v4.1.2 上使用节点包RequestJS v2.65.0

我正在尝试从某些站点(例如 GitHub.com)读取 SSL 证书这以前在节点 0.12 上工作。然而,在节点 4.2.1 上,getPeerCertificate()返回null.

例如:

request({
  url: 'https://github.com'
}, function (err, res, body) {
  console.log('err:', err)
  console.log('peerCertificate:',res.req.connection.getPeerCertificate());
  console.log('authorized:',res.req.connection.authorized);
  console.log('authorizationError:',res.req.connection.authorizationError);
});

将打印出来

err: null
peerCertificate: null
authorized: true
authorizationError: null

即建立了安全连接,但证书为空。

根据我的(基本)理解,如果连接被授权,应该有一个对等证书。

我尝试了许多 SSL 站点,结果是一样的。请求中是否有选项、Node 4 的错误或我对SSL/TLS 如何在节点中工作的误解?

4

2 回答 2

4

我认为您的问题是因为getPeerCertificate()只有在连接处于状态时才会输出任何内容connected,但是当您收到回复时,可能已经为时已晚。

如果要getPeerCertificate输出,则应在 TLS 级别独立执行,如下所示:

const socket = require('tls').connect(443, "github.com", () => {
  console.log('client connected',
    socket.authorized ? 'authorized' : 'unauthorized');
  process.stdin.pipe(socket);
  process.stdin.resume();
});

重要的!: 不要将协议放在 URL 中。而是使用 require('url').parse(yourURL).hostname 作为目标。

更多信息和示例在这里:https ://nodejs.org/api/tls.html#tls_tls_connect_port_host_options_callback

于 2016-09-04T10:20:01.070 回答
3

@nembleton 关于为什么会发生这种情况是正确的。在https://github.com/request/request/issues/1867有一个问题

您可以坚持使用 Request 并使用其流 API,而不是直接使用原始 TLS 套接字。如果您正在利用其他会使低级连接更加复杂的请求功能(例如通过 HTTPS 代理),这种方法特别有用。

原始问题中的代码片段变为:

request({
  url: 'https://github.com'
})
.on('error', function(err) {
    console.log('err:', err);
})
.on('response', function (res) {
  console.log('peerCertificate:',res.socket.getPeerCertificate());
  console.log('authorized:',res.socket.authorized);
  console.log('authorizationError:',res.socket.authorizationError);
});

(我使用res.socket而不是res.req.connection为了简洁/直接,但任何一个都可以。)

于 2018-01-09T11:22:19.473 回答