Forge.js导出RSA私钥pem格式总是无效怎么办?
我在用Forge.js生成RSA密钥对时,按照文档导出的pem格式总是被其他工具报错。明明参数都对,但生成的私钥文件好像格式不对。
我这样写的代码:
const forge = require('node-forge');
const key = forge.pki.rsa.generateKeyPair(2048);
const pem = forge.pki.privateKeyToPem(key.privateKey);
console.log(pem);
// 输出结果类似:-----BEGIN RSA PRIVATE KEY-----
// ...base64 data...
// -----END RSA PRIVATE KEY-----
但当我用openssl命令检查时提示错误:
openssl rsa -text -noout -in key.pem
报错信息是:
unable to load Private Key
140532490183872:error:0906D06C:PEM routines:PEM_read_bio:no start line:../crypto/pem/pem_lib.c:745:
试过把导出方式改成privateKeyToPem和rsaPrivatePkcs1ToPem都不行,难道是密钥格式不兼容?
Forge.js 的
privateKeyToPem实际上导出的是 PKCS#1 格式(也就是-----BEGIN RSA PRIVATE KEY-----开头),而 OpenSSL 在某些版本或配置下更习惯接受 PKCS#8 格式(-----BEGIN PRIVATE KEY-----开头),尤其是当它被嵌入到其他工具链里时。你可以改用 PKCS#8 格式导出试试:
forge.pki.privateKeyToPem(key.privateKey, { format: 'pkcs8' })不过 node-forge 的
privateKeyToPem本身其实支持这个参数,但很多人没注意文档里那个可选参数。如果还是不行,还可以手动转一下:如果这样还不行,大概率是你的 PEM 字符串里有隐藏字符或者换行问题,比如从文件读写时没注意编码,或者被某些编辑器加了 BOM。可以打印出来看看有没有奇怪的字符,或者直接用
fs.writeFileSync写到文件再用 openssl 检查:再跑
openssl rsa -in key.pem -text -noout,一般就正常了。如果还是报
no start line,那大概率是你复制粘贴的时候漏了头尾的-----BEGIN...行,或者多加了空格。openssl rsa默认期望 PKCS#8 格式,而 forge.js 输出的是 PKCS#1。用这个命令检查就行:如果非要转成兼容性更好的 PKCS#8,用 openssl 转一下:
或者在代码里直接生成标准格式就行了。