You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RS256生成JWT时jsonwebtoken不识别私钥的问题排查

问题分析与解决方案

报错原因

你生成的私钥处于加密状态(从私钥里的Proc-Type: 4,ENCRYPTED字段可确认)。即便手动删除Proc-Type和DEK-Info两行,私钥主体内容仍是加密后的密文,jsonwebtoken库无法解析这类加密私钥,因此判定它不是有效的非对称密钥,抛出secretOrPrivateKey must be an asymmetric key when using RS256错误。

解决办法

方法1:生成未加密的私钥(推荐)

重新执行密钥生成命令,在提示输入密码(passphrase)时直接按两次回车跳过,生成未加密的RSA私钥:

ssh-keygen -t rsa -b 4096 -m PEM -f <filename>

生成的未加密私钥无加密相关头部行,可直接被jsonwebtoken识别,格式示例:

-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEA...(未加密的私钥内容)
-----END RSA PRIVATE KEY-----

方法2:使用加密私钥并提供密码

如果必须保留加密私钥,调用jwt.sign时需在配置选项中传入私钥的加密密码:

const jwt = require('jsonwebtoken');
const fs = require('fs');

const privateKey = fs.readFileSync('<你的加密私钥路径>', 'utf8');
const myData = { /* 待签名的数据 */ };
const options = {
  algorithm: 'RS256',
  passphrase: '你的私钥加密密码' // 需与生成私钥时设置的密码一致
};

jwt.sign(myData, privateKey, options, (err, token) => {
  if (err) console.error(err);
  else console.log(token);
});

验证私钥状态

可通过openssl命令快速确认私钥是否加密:

openssl rsa -check -in <私钥文件路径>

若命令要求输入密码,说明私钥是加密的;直接输出私钥信息则为未加密状态。

内容的提问来源于stack exchange,提问作者Lee Morgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:52:20