Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从https证书读取关键扩展_Javascript_Node.js_Ssl_Https_X509 - Fatal编程技术网

Javascript 从https证书读取关键扩展

Javascript 从https证书读取关键扩展,javascript,node.js,ssl,https,x509,Javascript,Node.js,Ssl,Https,X509,我想为节点https证书验证执行自定义验证。因此,在https选项中,我将rejectUnauthorized属性设置为false var httpsOptions = { ... rejectUnauthorized: false, ... }; 现在,即使证书验证在内部失败,请求也不会失败。我想手动处理那部分。我想处理未处理的关键扩展错误。我的代码是 var req = https.request(httpsOptions, (res) => { va

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

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

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();
上述代码按预期工作。我可以说当
未处理的关键扩展发生错误时。在
if
条件(验证扩展的位置)中,我想看看哪些是未处理的
关键扩展。如果它与我的列表不匹配,我想中止请求
req.socket
有太多属性,所以我无法粘贴到这里。其中没有保存那些
未处理的
关键扩展的字段。如何提取导致错误的未处理的关键扩展

注意:我看到了一些
npm
包,它们可以解析ssl证书,比如
x509
PKIjs
。这给了我很多困惑,我找不到任何能解决我问题的工作实例

编辑


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

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

var certInBuf = req.socket.getPeerCertificate().raw;
有很多包可用于将此缓冲区格式转换为pem格式。其中之一是

然后,我们可以使用解析证书并提取扩展

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

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

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

var certInBuf = req.socket.getPeerCertificate().raw;
有很多包可用于将此缓冲区格式转换为pem格式。其中之一是

然后,我们可以使用解析证书并提取扩展

var pki = require('node-forge').pki;
var extensions = pki.certificateFromPem(certInPem).extensions;
然后我们可以验证扩展。如果不满意,我们可以通过调用
req.abort()