secretOrPrivateKey must be an asymmetric key when using RS256
我正在使用 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
但没有任何改变。
有什么解决办法吗?
这篇文章有一个答案,但它被删除了,所以我再次回答我的问题。
我的代码如下所示:
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
进行检查。
您可以在此处找到许多可能对您有帮助的有用命令。
crypto.createPrivateKey 函数用于从私钥创建非对称密钥实例
const privateKey = crypto.createPrivateKey(privateKEY);
当我将Ubuntu
从20.04.5
升级到22.04.2
版本时,我也遇到了同样的问题。它曾经与以前的版本配合得很好。当我们在Ubuntu 22.04.2
和Node 16.xx.xx
上使用它时,似乎会出现一些与系统相关的问题。当我将 Node.JS 版本从 16 升级到 Node.JS 18
时,它对我来说是有效的。
解决方案:
- 在任何编辑器中打开密钥文件,然后只需删除文件末尾的新行即可。
- 将node版本更新到当前的 LTS (我遇到了同样的问题,这对我有用)
如果您使用 nvm,请尝试
nvm install 18.15.0
nvm use 18.15.0
您可以指定 NODE 的当前 LTS 版本。我的情况是 18.15.0