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

调用jwt.sign指定RS256算法报PEM routines无起始行错误如何解决

报错原因

Error: error:0909006C:PEM routines:get_name:no start line
该报错的核心原因是RS256与默认HS256算法的密钥格式要求不同:

  • RS256属于非对称加密算法,签名时需要传入PEM格式的RSA私钥,必须包含-----BEGIN RSA PRIVATE KEY-----开头、-----END RSA PRIVATE KEY-----结尾的标准格式
  • 你当前传入的process.env.JWT_SECRET是适配对称加密算法HS256的普通字符串,不符合PEM格式要求,Node.js内置crypto模块解析时找不到PEM格式的起始标记行,因此抛出错误。

注释algorithm: "RS256"后jsonwebtoken库默认使用HS256算法,和你传入的普通字符串密钥格式匹配,因此可以正常运行。

保留RS256配置的解决方案

1. 生成RSA公私钥对

在Mac终端执行以下openssl命令生成2048位RSA密钥对:

# 生成私钥文件private.key
openssl genrsa -out private.key 2048
# 生成对应公钥文件public.key(后续用于验证JWT)
openssl rsa -in private.key -pubout -out public.key

生成的密钥文件默认存放在当前执行命令的目录下。

2. 加载私钥替换原有密钥

推荐直接读取私钥文件的方式,避免环境变量转义问题,示例代码如下:

const jwt = require("jsonwebtoken");
const fs = require("fs");
// 读取PEM格式私钥
const privateKey = fs.readFileSync("./private.key", "utf8");

// 签名逻辑保留RS256配置
const token = jwt.sign(user.dataValues, privateKey, {
    algorithm: "RS256",
    expiresIn: "14 days",
});

如果要将私钥存入.env文件,需要把私钥内容中的所有换行替换为\n,加载时再还原格式即可。

注意事项

  • 私钥属于核心敏感信息,必须添加到.gitignore文件中,禁止提交到代码仓库
  • 生产环境建议使用专用密钥管理服务存储私钥,不要直接存放在项目配置文件中
  • 后续验证JWT时需要使用配对的公钥public.key进行验证,不要使用私钥验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:36:01