从https证书中读取关键扩展

时间:2016-12-27 11:50:51

标签: javascript node.js ssl https x509

我想为节点https证书验证进行自定义验证。因此,在https选项中,我将lstApprove属性设置为rejectUnauthorized

false

现在即使证书验证内部失败,请求也不会失败。我想手动处理那个部分。我想处理var httpsOptions = { ... rejectUnauthorized: false, ... }; 错误。我的代码是,

unhandled critical extension

上面的代码按预期工作。我可以说发生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(); 错误。在unhandled critical extension条件(放置以验证扩展名)中,我想查看未处理的所有if内容。如果它与我的列表不匹配,我想中止请求。 critical extensions有很多属性,所以我无法粘贴到这里。其中没有字段,其中包含req.socket个关键扩展。如何提取导致错误的未处理的关键扩展?

注意:我见过一些可以解析unhandlednpm等ssl证书的x509个软件包。它给人很多困惑,我找不到任何可以解决我问题的工作实例。

修改

PKIjsreq.socket.getPeerCertificate().raw格式提供DER证书。如何解码并查看这些扩展?

1 个答案:

答案 0 :(得分:0)

首先我们需要获取服务器证书。我们可以使用req.socket.getPeerCertificate()来获取它。它返回一个JSON对象,但它没有扩展部分。但是,它将在buffer属性中以raw格式提供整个证书。

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

有很多软件包可用于将此缓冲区格式转换为pem格式。其中一个是pemtools

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

然后我们可以使用node-forge来解析证书并提取扩展名。

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

然后我们可以验证扩展。如果不满意,我们可以通过致电req.abort()

来中止请求