如何从CSR中提取备用名称数据?JS实现及替代库推荐
解析CSR中的Subject Alternative Name(备用名称)
用pkijs提取备用名称的正确方法
pkijs本身支持解析SAN扩展,只是需要手动定位对应扩展并解码二进制内容。步骤如下:
- 找到CSR扩展中OID为
2.5.29.17的条目(这是Subject Alternative Name的标准OID) - 用
pkijs.GeneralNames.fromBER解码扩展的二进制值 - 遍历解码后的
names数组,根据类型提取对应名称
示例代码:
// 假设已通过pkijs解析得到CSR对象csr const sanOid = "2.5.29.17"; const sanExtension = csr.extensions.find(ext => ext.extnID === sanOid); if (sanExtension) { // 解码SAN扩展的二进制内容 const san = pkijs.GeneralNames.fromBER(sanExtension.extnValue.valueBlock.valueHex); // 提取不同类型的备用名称 const alternativeNames = san.names.map(name => { switch (name.type) { case 2: // DNS域名 return name.value; case 1: // 电子邮件地址 return name.value; case 7: // IP地址 return name.value.toString(); // 可根据需求添加其他类型(如URI、目录名等) default: return `[未知类型${name.type}]: ${name.value}`; } }); console.log("提取到的备用名称:", alternativeNames); } else { console.log("该CSR未包含备用名称扩展"); }
替代库推荐
如果觉得pkijs的操作太繁琐,可以试试以下更易用的库:
jsrsasign
轻量且前后端通用,直接提供SAN提取方法,无需手动处理OID和BER解码:
const csrPem = "你的CSR PEM格式字符串"; const csr = new KJUR.asn1.csr.CSR({str: csrPem}); const sanList = csr.getExtSAN(); console.log("备用名称列表:", sanList);
node-forge(Node.js环境)
适合后端场景,API直观:
const forge = require('node-forge'); const csrPem = "你的CSR PEM格式字符串"; const csr = forge.pki.certificationRequestFromPem(csrPem); const sanAttr = csr.getAttribute({name: 'subjectAltName'}); if (sanAttr) { const sanList = forge.pki.altNameToAsn1(sanAttr.value).split(', '); console.log("备用名称列表:", sanList); }
内容的提问来源于stack exchange,提问作者Сергей Илларионов
相关产品推荐
相关产品推荐

