在Node.js中不依赖node-forge将PEM字符串转为X509证书并提取SAN
不用第三方库实现PEM转X509并提取SAN
嘿,刚好知道怎么弄!不用依赖node-forge这类第三方库,咱们直接用Node.js自带的crypto模块就能完成PEM到X509证书的转换,还能轻松提取Subject Alternative Name(SAN)。以下是具体步骤和代码示例:
核心思路
Node.js的crypto模块内置了X509Certificate类,可以直接解析PEM格式的证书,并且提供了直接获取SAN的属性,不需要手动处理ASN.1编码的扩展字段。
实现代码
const crypto = require('crypto'); // 你的PEM证书字符串(确保格式完整,包含BEGIN/END标记) const pemCertificate = `-----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIJAK0JmDc/YXWsMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD VQQGEwJJTjELMAkGA1UECBMCQVAxDDAKBgNVBAcTA0hZRDEZMBcGA1UEChMQUm9j a3dlbGwgY29sbGluczEcMBoGA1UECxMTSW5kaWEgRGVzaWduIENlbnRlcjEOMAwG A1UEAxMFSU1BQ1MxKTAnBgkqhkiG9w0BCQEWGmJyYWphbkBSb2Nrd2VsbGNvbGxp bnMuY29tMB4XDTExMDYxNjE0MTQyM1oXDTEyMDYxNTE0MTQyM1owgZwxCzAJBgNV BAYTAklOMQswCQYDVQQIEwJBUDEMMAoGA1UEBxMDSFlEMRkwFwYDVQQKExBSb2Nr d2VsbCBjb2xsaW5zMRwwGgYDVQQLExNJbmRpYSBEZXNpZ24gQ2VudGVyMQ4wDAYD VQQDEwVJTUFDUzEpMCcGCSqGSIb3DQEJARYaYnJhamFuQFJvY2t3ZWxsY29sbGlu cy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfjHgUAsbXQFkF hqv8OTHSzuj+8SKGh49wth3UcH9Nk/YOug7ZvI+tnOcrCZdeG2Ot8Y19Wusf59Y7 q61jSbDWt+7u7P0ylWWcQfCE9IHSiJIaKAklMu2qGB8bFSPqDyVJuWSwcSXEb9C2 xJsabfgJr6mpfWjCOKd58wFprf0RF58pWHyBqBOiZ2U20PKhq8gPJo/pEpcnXTY0 x8bw8LZ3SrrIQZ5WntFKdB7McFKG9yFfEhUamTKOffQ2Y+SDEGVDj3eshF6+Fxgj 8plyg3tZPRLSHh5DR42HTc/35LA52BvjRMWYzrs4nf67gf652pgHh0tFMNMTMgZD rpTkyts9AgMBAAGjggEFMIIBATAdBgNVHQ4EFgQUG0cLBjouoJPM8dQzKUQCZYNY y8AwgdEGA1UdIwSByTCBxoAUG0cLBjouoJPM8dQzKUQCZYNYy8ChgaKkgZ8wgZwx CzAJBgNVBAYTAklOMQswCQYDVQQIEwJBUDEMMAoGA1UEBxMDSFlEMRkwFwYDVQQK ExBSb2Nrd2VsbCBjb2xsaW5zMRwwGgYDVQQLExNJbmRpYSBEZXNpZ24gQ2VudGVy MQ4wDAYDVQQDEwVJTUFDUzEpMCcGCSqGSIb3DQEJARYaYnJhamFuQFJvY2t3ZWxs Y29sbGlucy5jb22CCQCtCZg3P2F1rDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB BQUAA4IBAQCyYZxEzn7203no9TdhtKDWOFRwzYvY2kZppQ/EpzF+pzh8LdBOebr+ DLRXNh2NIFaEVV0brpQTI4eh6b5j7QyF2UmA6+44zmku9LzS9DQVKGLhIleB436K ARoWRqxlEK7TF3TauQfaalGH88ZWoDjqqEP/5oWeQ6pr/RChkCHkBSgq6FfGGSLd ktgFcF0S9U7Ybii/MD+tWMImK8EE3GGgs876yqX/DDhyfW8DfnNZyl35VF/80j/s 0Lj3F7Po1zsaRbQlhOK5rzRVQA2qnsa4IcQBuYqBWiB6XojPgu9PpRSL7ure7sj6 gRQT0OIU5vXzsmhjqKoZ+dBlh1FpSOX2 -----END CERTIFICATE-----`; // 初始化X509证书实例 const cert = new crypto.X509Certificate(pemCertificate); // 提取SAN const subjectAltName = cert.subjectAltName; if (subjectAltName) { // 将SAN字符串拆分为结构化的数组(可选,方便后续处理) const sanEntries = subjectAltName.split(', ').map(entry => { const [type, value] = entry.split(':'); return { type, value }; }); console.log('提取到的Subject Alternative Name:'); console.log(sanEntries); } else { console.log('该证书未包含Subject Alternative Name扩展'); }
关键说明
- 版本要求:
crypto.X509Certificate类从Node.js v15.0.0开始引入,如果你的Node版本低于这个版本,建议升级到较新版本。 - 格式校验:确保传入的PEM字符串格式完整,必须包含
-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----标记,换行符不影响解析,但标准格式更稳妥。 - 无SAN的情况:如果证书没有配置SAN,
cert.subjectAltName会返回undefined,代码中已经做了判断处理。
内容的提问来源于stack exchange,提问作者OpenStack
相关产品推荐
相关产品推荐

