从节点中的 x509 检索主题替代名称

问题描述 投票:0回答:1

我正在尝试从 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

javascript node.js smartcard x509 pki
1个回答
0
投票

您可以使用 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 是主题替代名称属性的 oid。 您可以根据您的要求修改代码。希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.