secretOrPrivateKey must be an asymmetric key when using RS256

回答 4 浏览 9434 2023-03-04

我正在使用 jsonwebtoken 生成不记名令牌。
按照 文档 提供的示例,我的代码如下所示

var privateKey = fs.readFileSync('src\\private.key'); //returns Buffer
let token = jwt.sign(myJsonContent, privateKey, { algorithm: 'RS256' });

此代码在控制台中返回此错误

secretOrPrivateKey must be an asymmetric key when using RS256

我尝试将密钥包含在我的 .env 文件中,但错误是相同的
我也尝试将 privateKey 声明为 Buffer 但没有任何改变。
有什么解决办法吗?

Synapsis 提问于2023-03-04
您本地的 Node.js 版本是什么?Filip Szymański 2023-03-04
@FilipSzymański v16.14.0Synapsis 2023-03-04
您能否也提及您的操作系统版本?Vipul Patil 2023-03-06
4 个回答
#1楼 已采纳
得票数 5

这篇文章有一个答案,但它被删除了,所以我再次回答我的问题。

我的代码如下所示:

var privateKey = fs.readFileSync('src\\private.key', 'utf8');
let token = jwt.sign(myJsonContent, privateKey, { algorithm: 'RS256'});

我遇到的问题与私钥不对称有关。
问题是密钥需要以正确的.PAM格式写入。

.PAM 格式如下所示:

-----BEGIN RSA PRIVATE KEY-----
encoded key etc
-----END RSA PRIVATE KEY-----

除非您已经有密钥,否则您需要生成它, 为此,我使用了openssl
您可以下载它 这里

下载后,打开 bin 文件夹并执行名为 "openssl.exe"的文件,此时粘贴此命令

genrsa -out privateKey.key 2048

这将在 bin 文件夹中生成一个名为 privateKey.key 的文件。
此时您可以复制并粘贴该文件的内容并将其用作密钥
或者像我一样将文件导入到您的项目中并使用 readFileSync 。

这对我有用并解决了我遇到的问题。

如果您已有密钥,但遇到同样的问题,我建议您使用openssl进行检查。
您可以在此处找到许多可能对您有帮助的有用命令。

Synapsis 提问于2023-03-10
使用“traditional” 开关生成密钥给了我正确的 PAM 格式。默认操作忽略密码类型。openssl genrsa -traditional -out private-key.pem 3072kirenpillay 2023-04-27
#2楼
得票数 1

crypto.createPrivateKey 函数用于从私钥创建非对称密钥实例

const privateKey = crypto.createPrivateKey(privateKEY);
Venkata Reddy 提问于2023-05-12
Moritz Ringler 修改于2023-05-13
#3楼
得票数 0

当我将Ubuntu20.04.5升级到22.04.2版本时,我也遇到了同样的问题。它曾经与以前的版本配合得很好。当我们在Ubuntu 22.04.2Node 16.xx.xx上使用它时,似乎会出现一些与系统相关的问题。当我将 Node.JS 版本从 16 升级到 Node.JS 18 时,它对我来说是有效的。

Vipul Patil 提问于2023-03-06
这篇文章有一个正确的答案,但已被删除。对我来说,问题是密钥必须采用正确的 .PAM 格式Synapsis 2023-03-08
@Synapsis 我现在确实遇到了这个问题,但无论我做什么,PAM 格式或其他方式,它都不起作用:/您还可以提供其他任何内容吗?Jridyard 2023-03-09
@Jridyard我发布了对我有用的解决方案,希望它有帮助Synapsis 2023-03-10
#4楼
得票数 0

解决方案:

  1. 在任何编辑器中打开密钥文件,然后只需删除文件末尾的新行即可。
  2. 将node版本更新到当前的 LTS (我遇到了同样的问题,这对我有用)

如果您使用 nvm,请尝试

  • nvm install 18.15.0
  • nvm use 18.15.0

您可以指定 NODE 的当前 LTS 版本。我的情况是 18.15.0

Narendhran 提问于2023-03-15
Narendhran 修改于2023-03-20