2016-12-27 6 views
0

Je souhaite effectuer une validation personnalisée pour la vérification du certificat https node. Ainsi, dans les options https, j'ai défini la propriété rejectUnauthorized sur false.Lire les extensions critiques du certificat https

var httpsOptions = { 
    ... 
    rejectUnauthorized: false, 
    ... 
}; 

Maintenant, même si la vérification du certificat échoue à l'interne, la demande ne manquera pas. Je veux gérer cette partie manuellement. Je voulais gérer l'erreur unhandled critical extension. Mon code pour le faire est,

var req = https.request(httpsOptions, (res) => { 
    var data = ''; 
    res.on('data', (chunk) => { 
     data += chunk; 
    }); 
    res.on('end',() => { 
    console.log(data); 
    }); 
}); 

req.on("socket", function() { 
    req.socket.on('secureConnect',() => { 
    if(!req.socket.authorized){ 
     if(req.socket.authorizationError === 'unhandled critical extension'){ 
     // Place to verify extensions 
     } 
     process.nextTick(() => {req.abort();});  
    } 
    }); 
}); 

req.write(JSON.stringify(requestObj)); 
req.end(); 

Le code ci-dessus fonctionne comme prévu. Je peux dire quand unhandled critical extension erreur se produit. Dans la condition if (Place pour vérifier les extensions), je veux voir ce que tous les critical extensions sont non gérées. Si elle ne correspond pas à la liste que j'ai, je veux annuler la demande. req.socket a tellement de propriétés, donc je ne pouvais pas coller ici. Il n'y a aucun champ dedans, qui contient ces unhandled extensions critiques. Comment extraire les extensions critiques non gérées qui ont provoqué l'erreur?

Note: J'ai vu quelques npm paquets qui pourraient parser certificats ssl comme x509 et PKIjs. Cela donne beaucoup de confusion et je n'ai pas trouvé d'exemple qui puisse résoudre mon problème.

EDIT:

req.socket.getPeerCertificate().raw donne le certificat DER au format Buffer. Comment le décoder et voir ces extensions?

Répondre

0

Nous devons d'abord obtenir le certificat de serveur. Nous pouvons utiliser req.socket.getPeerCertificate() pour l'obtenir. Il retourne un objet JSON mais il n'aura pas de section d'extensions. Mais, il aura le certificat entier au format buffer dans sa propriété raw.

var certInBuf = req.socket.getPeerCertificate().raw; 

Il y a beaucoup de paquets disponibles pour convertir ce format de tampon au format pem. L'un d'eux est pemtools

var certInPem = pemtools(certInBuf, 'CERTIFICATE').toString(); 

Ensuite, nous pouvons utiliser node-forge pour analyser le certificat et extraire les extensions.

var pki = require('node-forge').pki; 
var extensions = pki.certificateFromPem(certInPem).extensions; 

Ensuite nous pourrons valider les extensions. Si vous n'êtes pas satisfait, nous pouvons annuler la demande en appelant req.abort()