【问题标题】:Encoding the data to JWT token with NodeJS getting error PEM routines:PEM_read_bio:no start line使用 NodeJS 将数据编码为 JWT 令牌得到错误 PEM 例程:PEM_read_bio:no start line
【发布时间】:2020-11-07 01:11:34
【问题描述】:

我尝试使用 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));  
};

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript node.js jwt


    【解决方案1】:

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

    您可以使用 online tool 或使用 openssl 生成公钥/私钥对,如该链接或下方所述。

    然后像这样读取密钥并签名令牌(示例取自documentation):

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

    并使用公钥进行验证:

    // 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
    });
    

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

    openssl genrsa 2048 -out rsa-2048bit-key-pair.pem  
    

    对于 ES256,密钥对是不同的,会像这样生成:

    openssl ecparam -genkey -name prime256v1 -noout -out ec256-key-pair.pem
    

    【讨论】:

    • 感谢您的回复,一旦我整合我将批准此答案。我对算法格式 ES*** 和 PS*** 还有一个疑问
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 2017-02-18
    • 2019-01-31
    • 2020-07-16
    • 2014-04-30
    • 1970-01-01
    • 2017-02-24
    • 2018-07-04
    相关资源
    最近更新 更多