Forge.js导出RSA私钥pem格式总是无效怎么办?

闲人莉霞 阅读 82

我在用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:

试过把导出方式改成privateKeyToPemrsaPrivatePkcs1ToPem都不行,难道是密钥格式不兼容?

我来解答 赞 17 收藏
二维码
手机扫码查看
2 条解答
春艳酱~
试试这个方法,问题出在 Forge.js 默认导出的是 PKCS#1 格式的 RSA 私钥,但 OpenSSL 对 PEM 格式要求更严格,特别是开头的标记名容易混淆。

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 本身其实支持这个参数,但很多人没注意文档里那个可选参数。如果还是不行,还可以手动转一下:

const forge = require('node-forge');

const keyPair = forge.pki.rsa.generateKeyPair(2048);
const pkcs8Pem = forge.pki.privateKeyToPem(keyPair.privateKey, { format: 'pkcs8' });
console.log(pkcs8Pem);


如果这样还不行,大概率是你的 PEM 字符串里有隐藏字符或者换行问题,比如从文件读写时没注意编码,或者被某些编辑器加了 BOM。可以打印出来看看有没有奇怪的字符,或者直接用 fs.writeFileSync 写到文件再用 openssl 检查:

const fs = require('fs');
fs.writeFileSync('key.pem', pkcs8Pem, 'utf8');


再跑 openssl rsa -in key.pem -text -noout,一般就正常了。
如果还是报 no start line,那大概率是你复制粘贴的时候漏了头尾的 -----BEGIN... 行,或者多加了空格。
点赞 7
2026-02-23 22:09
Mr.鹤荣
Mr.鹤荣 Lv1
你导出的 PEM 格式没错,但 openssl rsa 默认期望 PKCS#8 格式,而 forge.js 输出的是 PKCS#1。用这个命令检查就行:

openssl rsa -text -noout -inform PEM -in key.pem


如果非要转成兼容性更好的 PKCS#8,用 openssl 转一下:

openssl pkcs8 -topk8 -nocrypt -in key.pem -out key_pkcs8.pem


或者在代码里直接生成标准格式就行了。
点赞 13
2026-02-08 23:07