使用 NodeJS 将数据编码为 JWT 令牌,出现错误 PEM 例程:PEM_read_bio:无起始行

Rag*_* SK 5 javascript node.js jwt

我尝试使用nodejs中的包使用密钥对数据进行编码jsonwebtoken,并收到以下错误:

错误:0906D06C:PEM 例程:PEM_read_bio:无起始行 编码时出错

我用来使用密钥和算法对数据进行编码的代码如下:

var data = {
  sub: "1234567890",
  name: "John Doe"
};

var secretKey = "secret123";

var algorithm = { algorithm: "RS384" };

getJWTToken(data, secretKey, algorithm);

let getJWTToken = function(data, secretKey, algorithm) {
  console.log(token: jsonwebtoken.sign(data, secretKey, algorithm));  
};
Run Code Online (Sandbox Code Playgroud)

看来问题出在算法上。当我使用该算法时HS256HS384HS512工作正常,但是当我使用该算法时RS256RS384RS512收到此错误。

谁能帮我解决这个问题?

jps*_*jps 5

对于 RSA 算法,您需要提供PEM 格式的RSA私钥来签署令牌,并提供 RSA 公钥来验证它。您不能像 HSxxx 算法那样只传递一个简单的字符串。

您可以使用在线工具或 openssl生成公钥/私钥对,如该链接或下面所述。

然后读取密钥并签署令牌,如下所示(示例取自文档

// sign with RSA SHA256
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' });
Run Code Online (Sandbox Code Playgroud)

并用公钥验证:

// verify a token asymmetric
var cert = fs.readFileSync('public.pem');  // get public key
jwt.verify(token, cert, function(err, decoded) {
  console.log(decoded.foo) // bar
});
Run Code Online (Sandbox Code Playgroud)

对于 ESxxx 和 PSxxx 算法,它与 RSxxx 算法基本相同。据此,可以为 RSxxx 和 Psxxx 算法生成并使用相同的密钥对,如下所示:

openssl genrsa 2048 -out rsa-2048bit-key-pair.pem  
Run Code Online (Sandbox Code Playgroud)

对于 ES256,密钥对是不同的,生成方式如下:

openssl ecparam -genkey -name prime256v1 -noout -out ec256-key-pair.pem
Run Code Online (Sandbox Code Playgroud)