2015-10-26 1 views
3

J'utilise le package noeud RequestJS v2.65.0 sur le noeud v4.1.2RequestJS - connexion SSL est autorisé, mais getPeerCertificate() retourne null

Je suis en train de read the SSL certificate de certains sites (par exemple GitHub.com.). Cela a précédemment travaillé sur le noeud 0,12. Sur le nœud 4.2.1, cependant, getPeerCertificate() renvoie null.

Par exemple:

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); 
}); 

imprimera

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

à savoir la connexion sécurisée est établie, mais le certificat est nul. D'après ma compréhension (élémentaire), si la connexion est autorisée, il devrait y avoir un certificat homologue.

J'ai essayé avec un certain nombre de sites SSL, et le résultat est le même. Y at-il une option dans la demande, un bug avec Node 4, ou un malentendu de ma part sur la façon dont SSL/TLS works in node?

+0

Je ne vois pas pourquoi cela devrait fonctionner du tout. Vous avez une erreur: qu'est-ce qui vous fait penser qu'il y a même une connexion TCP? sans parler d'une connexion SSL authentifiée? – EJP

Répondre

0

Je pense que votre problème est que le getPeerCertificate() ne produira rien lorsque la connexion est en état connected, mais lorsque vous recevez votre réponse, il est probablement déjà trop tard.

Si vous voulez getPeerCertificate à la sortie, vous devez le faire au niveau TLS indépendamment en tant que tel:

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

Important! : Ne mettez pas le protocole dans l'URL. Utilisez plutôt require ('url'). Parse (yourURL) .hostname comme cible.

Plus d'infos et par exemple ici: https://nodejs.org/api/tls.html#tls_tls_connect_port_host_options_callback

0

@nembleton est correct au sujet de pourquoi cela se produit. Il y a un problème pour cela à https://github.com/request/request/issues/1867

Plutôt que de descendre aux sockets TLS brutes, vous pouvez rester avec Request et utiliser son API de flux. Cette approche est particulièrement utile si vous utilisez d'autres fonctionnalités de demande qui compliqueraient la connexion de bas niveau (par exemple, via un proxy HTTPS).

L'extrait de code dans la question initiale devient:

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); 
}); 

(j'ai utilisé res.socket plutôt que res.req.connection par souci de concision/immédiateté, mais soit fonctionnera.)