如何在Node.js中解析X.509格式CSR获取Subject信息?
在Node.js中解析X.509 CSR并提取Subject信息
问题背景
我持有一份X.509格式的证书签名请求(CSR),格式如下:
-----BEGIN CERTIFICATE REQUEST----- MII.... -----END CERTIFICATE REQUEST-----
需要从中提取Subject中的字段(包括CN、emailAddress、C等),但尝试两种方法均报错:
尝试1:Node.js原生crypto库
代码:
const { X509Certificate } = await import('crypto'); const x509CSR = new X509Certificate(pem)
报错:
error:0909006C:PEM routines:get_name:no start line
尝试2:node-forge库
代码:
const { pki } = await require('node-forge'); x509CSR = pki.certificationRequestFromPem(pem);
报错:
Cannot read public key. OID is not RSA.
报错原因分析
- 原生
crypto库限制:X509Certificate类仅用于解析X.509证书,不支持解析CSR(证书签名请求),因此传入CSR会触发格式错误。 node-forge版本问题:旧版node-forge对非RSA公钥(如ECDSA)的CSR支持不完善,若你的CSR使用了非RSA算法,就会出现该报错。
解决方案
方案1:使用@peculiar/x509库(推荐,支持全算法)
该库专为X.509体系设计,支持所有主流公钥算法,解析CSR更可靠:
- 安装依赖:
npm install @peculiar/x509
- 解析CSR并提取Subject字段:
const { X509CertificateRequest } = require('@peculiar/x509'); async function extractCSRSubject(pem) { const csr = await X509CertificateRequest.fromPem(pem); const subject = csr.subject; // 提取指定字段 return { commonName: subject.get('commonName'), country: subject.get('countryName'), emailAddress: subject.get('emailAddress'), // 如需全量Subject,可直接转字符串 fullSubject: subject.toString() }; } // 调用示例 const csrPem = `-----BEGIN CERTIFICATE REQUEST----- MII.... -----END CERTIFICATE REQUEST-----`; extractCSRSubject(csrPem).then(result => console.log(result));
方案2:更新node-forge至最新版本
若偏好使用node-forge,先更新到修复了非RSA公钥支持的最新版:
- 更新依赖:
npm update node-forge
- 重新解析CSR:
const { pki } = require('node-forge'); function extractCSRSubjectWithForge(pem) { const csr = pki.certificationRequestFromPem(pem); const subjectData = {}; // 遍历所有Subject属性 csr.subject.attributes.forEach(attr => { subjectData[attr.name] = attr.value; }); return subjectData; } // 调用示例 extractCSRSubjectWithForge(csrPem);
内容的提问来源于stack exchange,提问作者Xavier Ottolini
相关产品推荐
相关产品推荐

