Node.js中出现TypeError: Cannot read property 'tagClass' of undefined问题求助
解决PKCS12读取时的
TypeError: Cannot read property 'tagClass' of undefined问题 你遇到的这个报错根源很明确——代码里引用了一个未定义的变量,导致forge.asn1.toDer()无法获取有效的ASN.1对象。
问题出在哪
看你这段代码:
var msg = { type: 'CERTIFICATE', body: forge.asn1.toDer(asn1.cert).getBytes() };
这里的asn1变量完全没定义过!从PKCS12包里取出的cert对象,它的cert属性才是真正的ASN.1格式证书实例,你应该用cert.cert来替代asn1.cert。
修正后的完整代码
我把代码里的问题点都修正了,还补上了遗漏的fs模块引用:
var forge = require('node-forge'); var fs = require('fs'); // 你之前没引入这个模块,必须补上才能读取文件 var employeeID = '你的PKCS12密码'; // 替换成实际密码 var keyFile = fs.readFileSync('./test.p12', 'binary'); var p12Asn1 = forge.asn1.fromDer(keyFile); var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, false, employeeID); // 获取证书包 var certBags = p12.getBags({ bagType: forge.pki.oids.certBag }); var cert = certBags[forge.pki.oids.certBag][0]; // 修正ASN.1对象的引用 var msg = { type: 'CERTIFICATE', body: forge.asn1.toDer(cert.cert).getBytes() }; var pem = forge.pem.encode(msg); // 可以打印验证结果 console.log(pem);
额外补充:提取私钥和公钥
如果还需要从PKCS12里提取RSA私钥和公钥,可以加这段代码:
// 提取私钥 var keyBags = p12.getBags({ bagType: forge.pki.oids.pkcs8ShroudedKeyBag }); var privateKey = keyBags[forge.pki.oids.pkcs8ShroudedKeyBag][0].key; // 转成PEM格式私钥 var privateKeyPem = forge.pem.encode({ type: 'RSA PRIVATE KEY', body: forge.pki.privateKeyToAsn1(privateKey) }); // 从私钥导出公钥 var publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e); // 转成PEM格式公钥 var publicKeyPem = forge.pem.encode({ type: 'PUBLIC KEY', body: forge.pki.publicKeyToAsn1(publicKey) });
注意事项
- 确保已经安装node-forge:
npm install node-forge employeeID必须是PKCS12文件的正确密码,密码错误会导致后续读取失败- 如果你的PKCS12用的是其他密钥袋类型,可以调整
bagType参数,比如forge.pki.oids.keyBag
内容的提问来源于stack exchange,提问作者ghari
相关产品推荐
相关产品推荐

