You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从CSR中提取备用名称数据?JS实现及替代库推荐

解析CSR中的Subject Alternative Name(备用名称)

用pkijs提取备用名称的正确方法

pkijs本身支持解析SAN扩展,只是需要手动定位对应扩展并解码二进制内容。步骤如下:

  1. 找到CSR扩展中OID为2.5.29.17的条目(这是Subject Alternative Name的标准OID)
  2. 用pkijs.GeneralNames.fromBER解码扩展的二进制值
  3. 遍历解码后的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,提问作者Сергей Илларионов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:55:23