我想为节点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
个关键扩展。如何提取导致错误的未处理的关键扩展?
注意:我见过一些可以解析unhandled
和npm
等ssl证书的x509
个软件包。它给人很多困惑,我找不到任何可以解决我问题的工作实例。
修改:
PKIjs
以req.socket.getPeerCertificate().raw
格式提供DER证书。如何解码并查看这些扩展?
答案 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()