RequestJS - SSL 连接已授权但 getPeerCertificate() returns 为空
RequestJS - SSL connection is authorized but getPeerCertificate() returns null
我在节点 v4.1.2
上使用节点包 RequestJS v2.65.0
我正在尝试从某些网站(例如 GitHub.com)read the SSL certificate。 这之前在节点 0.12 上有效。然而,在节点 4.2.1 上,getPeerCertificate()
returns 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 站点,结果都是一样的。请求中是否有选项、节点 4 的错误或我对 SSL/TLS works in node 的误解?
我认为你的问题是因为 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
@nembleton 关于发生这种情况的原因是正确的。 https://github.com/request/request/issues/1867
有一个问题
与其使用原始 TLS 套接字,不如坚持使用 Request 并使用它的流 API。如果您正在利用其他会使低级连接更加复杂的请求功能(例如,通过 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
作为 brevity/directness,但两者都可以。)
我在节点 v4.1.2
上使用节点包 RequestJS v2.65.0我正在尝试从某些网站(例如 GitHub.com)read the SSL certificate。 这之前在节点 0.12 上有效。然而,在节点 4.2.1 上,getPeerCertificate()
returns 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 站点,结果都是一样的。请求中是否有选项、节点 4 的错误或我对 SSL/TLS works in node 的误解?
我认为你的问题是因为 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
@nembleton 关于发生这种情况的原因是正确的。 https://github.com/request/request/issues/1867
有一个问题与其使用原始 TLS 套接字,不如坚持使用 Request 并使用它的流 API。如果您正在利用其他会使低级连接更加复杂的请求功能(例如,通过 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
作为 brevity/directness,但两者都可以。)