Nest.js中JWK转PEM失败求助:已尝试jose等库仍报错
正确将RSA JWK转换为PEM格式的方法
你当前代码的核心问题是你的JWK是公钥(仅包含n和e),但你尝试导出pkcs1-private-pem格式的私钥,这必然报错。下面分库给出正确实现:
方法1:使用jose库(推荐)
jose库对JWK的处理更规范,直接支持公钥转换:
import { exportSPKI, importJWK } from 'jose'; // 你的JWK const jwkey = { kty: 'RSA', kid: 'eecb0ced-4d49-4100-9547-841e4100b756', n: '...very long string', e: 'AQAB', alg: 'RS256', use: 'sig', }; // 导入JWK并导出为PEM公钥 async function convertJWKtoPEM() { const publicKey = await importJWK(jwkey, 'RS256'); // 导出为SPKI格式的公钥PEM(通用格式) const pem = await exportSPKI(publicKey); console.log(pem); } convertJWKtoPEM();
如果你的环境是CommonJS,改用require导入:
const { exportSPKI, importJWK } = require('jose');
方法2:使用node-rsa库
修正你的代码,因为是公钥,要导入公钥组件并导出公钥格式:
const NodeRSA = require('node-rsa'); const jwkey = { kty: 'RSA', kid: 'eecb0ced-4d49-4100-9547-841e4100b756', n: '...very long string', e: 'AQAB', alg: 'RS256', use: 'sig', }; const key = new NodeRSA(); // 注意:导入公钥组件,指定类型为public key.importKey( { n: Buffer.from(jwkey.n, 'base64'), e: Buffer.from(jwkey.e, 'base64'), }, 'components-public' // 这里要写components-public,不是components ); // 导出公钥PEM,可选格式:pkcs8-public-pem 或 pkcs1-public-pem const pem = key.exportKey('pkcs8-public-pem'); console.log(pem);
方法3:使用jwk-to-pem库
这个库专门处理JWK转PEM,配置简单:
const jwkToPem = require('jwk-to-pem'); const jwkey = { kty: 'RSA', kid: 'eecb0ced-4d49-4100-9547-841e4100b756', n: '...very long string', e: 'AQAB', alg: 'RS256', use: 'sig', }; // 直接转换为PEM公钥 const pem = jwkToPem(jwkey); console.log(pem);
如果需要PKCS1格式(开头是-----BEGIN RSA PUBLIC KEY-----),添加参数:
const pem = jwkToPem(jwkey, { private: false, pemType: 'RSA PUBLIC KEY' });
内容的提问来源于stack exchange,提问作者codeForCoffee
相关产品推荐
相关产品推荐

