使用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
相关产品推荐
相关产品推荐

