NodeJS 从节点中的x509检索主题别名

mspsb9vt  于 2023-03-17  发布在  Node.js
关注(0)|答案(1)|浏览(97)

我正在尝试从DoD智能卡检索SAN,遇到主题备用名称返回othername:<unsupported>的问题。我没有找到很多解析此问题的示例,但我认为节点中的X509 li将解析此问题。正在寻找获取电子邮件地址的最佳方式的任何方向。

app.use((req, res, next) => {
  const cert = req.socket.getPeerCertificate();
  app.set("user", cert);

  const x509 = new X509Certificate(cert.raw);
  console.log(x509.toJSON());

  next();
});

尝试了用于nginx的F5库,但无法找到正确的属性来传递给它以解析电子邮件地址。
https://clouddocs.f5.com/training/community/nginx/html/class3/module1/module17.html

wpcxdonn

wpcxdonn1#

您可以使用node-forge库来解析Subject替代名称扩展名- othername属性。
对于以下配置,

subjectAltName = @alt_names
[alt_names]
DNS.1 = bp.client.com
otherName.1 = 2.16.123.1.2.1.2.1.2;UTF8:somevalue

下面的代码将解析证书并打印othername属性的值。

var forge = require('node-forge');
var asn1 = forge.asn1;
var certificate = forge.pki.certificateFromPem('-----BEGIN CERTIFICATE-----\n' + req.socket.getPeerCertificate(true).raw.toString('base64') + '\n-----END CERTIFICATE-----');
var otherNames = certificate.extensions.filter(ext => ext.id == '2.5.29.17').find(ext => ext.altNames).altNames.filter(altNames => altNames.type == 0);
var othernameValueforOid = ""
for(entry of otherNames) {
    if(entry.type === 0){
        if(entry.value[0].type === 6 && asn1.derToOid(entry.value[0].value) === '2.16.123.1.2.1.2.1.2'){
            othernameValueforOid = entry.value[1].value[0].value;
            break;
        }
    }
}
console.log(othernameValueforOid)

其中2.5.29.17是subject别名属性的oid。您可以根据自己的需要修改代码。希望对您有所帮助!

相关问题