首页 文章

检索JWT身份验证的证书/机密的问题 . (节点/快递/ C#/ IdentityServer)

提问于
浏览
5

我在我的node / express应用程序的服务器端验证JWT时遇到问题 . 该令牌是在asp.net核心应用程序中的Identity Server中生成的 . 生成的令牌是RS256令牌类型,这意味着需要在Identity Server中创建时生成私钥和公钥 . 这对我意味着什么 -

在客户端(Angular),我在登录后的所有请求中传递了Bearer令牌 . 我需要以某种方式验证该令牌 . 使用RS256令牌类型的方法是确保公钥匹配 . 我正在使用

const jwt2 = require('jwt-simple');

对于我的JWT验证 .

问题是秘密,这里是jwt-simple文档jwt-simple link . 如果我在解码中使第三个值为false,那么它可以工作,因为它忽略了所需的秘密/证书 .

我收到这个错误 -

错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始行

我正在中间件中进行此验证,因此所有 endpoints 都会触及它 . 我看到了这个问题 - SO Similar Issue并运行了相同的命令 . 我真的与证书有关,因为我从Identity Server项目中获取它 . 所以我需要从该项目中检索cert公钥 .

我怎样才能在令牌中发送该证书或以某种方式检索该有效证书?希望这有一定道理 . 任何帮助,将不胜感激 .

v1 - (使用自签名server.crt作为证书并获取此错误)

错误:签名验证失败

App.js

//This is for a self-signed certificate locally with no correlation to the token itself.
const options = {
    key: fs.readFileSync('./key.pem', 'utf8'),
    cert: fs.readFileSync('./server.crt', 'utf8')
 };

app.use((req, res, next) => {
    if(!req.headers.authorization){
        return res.status(403).json({ error: 'No credentials sent!'});
    } else {
        let token = req.headers.authorization.split(' ')[1]

        var decoded = jwt.decode(token, options.cert);

        if(decoded){
            let currentTime = new Date().getTime()/1000
            if(decoded.exp <= currentTime){
                return res.status(403).json({
                    error: 'Token has expired'
                }); 
            }
        }
        else if(!decoded){
            return res.status(403).json({
                error: 'invalid token'
            }); 
        }
    }
    next();
})

v2 - (使用随机文本作为证书并获得此错误)

错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始行

App.js

app.use((req, res, next) => {
    if(!req.headers.authorization){
        return res.status(403).json({ error: 'No credentials sent!'});
    } else {
        let token = req.headers.authorization.split(' ')[1]
        var secret = new Buffer('newsecret').toString('base64')
        var decoded = jwt2.decode(token, secret);
        if(decoded){
            let currentTime = new Date().getTime()/1000
            if(decoded.exp <= currentTime){
                return res.status(403).json({
                    error: 'Token has expired'
                }); 
            }
        }
        else if(!decoded){
            return res.status(403).json({
                error: 'invalid token'
            }); 
        }
    }
    next();
})

因此,我似乎需要一个具有正确签名的证书,该证书与令牌生成的签名相匹配 .

JWT.io解析了令牌结构 -

{
  "alg": "RS256",
  "kid": "1231231231231231231",
  "typ": "JWT",
  "x5t": "si7bdXd6......HnxhO4Wi_s"
}

我对x5t做了什么吗?道歉为长篇大论 . 谢谢 .

1 回答

  • 1

    我挖了一下,这是我的调查:

    node-jsonwebtoken docs,您的秘密必须是有效的私钥 .

    secretOrPrivateKey是一个字符串,缓冲区或对象,包含HMAC算法的秘密或RSA和ECDSA的PEM编码私钥 . 如果是带密码的私钥,则可以使用对象{key,passphrase}(基于加密文档),在这种情况下,请确保传递算法选项

    另外,最好在 encodedecode 函数中提供 'RS256' 作为第三个参数 .

    结帐以下示例代码:

    app.js

    var jwt = require('jwt-simple');
    var fs = require('fs')
    var payload = { foo: 'bar' };
    var secret = fs.readFileSync(__dirname + '/private.key');
    var token = jwt.encode(payload, secret, 'RS256');
    console.log(token);
    
    var decoded = jwt.decode(token, secret, 'RS256');
    console.log(decoded);
    

    execution:

    $ node app.js
      eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.SKLxSFErngKdXEYQOP5faOZXHe2N_2EG1KjesPWKaZVvV6m5vTA_n77Y0K4x3ngCFQhv_CCwnAaK8BeBChgs5JUW9nMqnpTl73GkJLTzICC1Kl2hiH9724JuDyweAwoUsMntxFWMDhERhBPehHi10LZbH2BINmO-xxuLkMeemL0
    { foo: 'bar' }
    

    示例私钥:

    -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCGMBPo1UPwep2kHj1auLvyi6tJwwf/BS6rv3dDlwyXcQq4fLY4 ldNc+FOpYOKQF33ZltmNkmi2IQukNKZtzJtFyMRNARXIcttTARGL6NIfsYU80kmB RCXjTc3rt088fmxij9HiXFQSpraKrt86ZQXnnkJyEGsQNuftm7yF7A3MOwIDAQAB AoGAGGuxg+MkHSTDgbW7JsKN+eMvRhpHX0L7LmiG9PcNZJY/BDo2E3A46ieLWjz2 npCX57yLVTd69QJokva9/yeIblQpOIXw1U5PlID5mgjTTxJNzLPbXxjuWixZXKJ3 VHZXIAktbM36jdBj5gpxPmWgHa1+572pkx60QIXppKm+8AkCQQDHhQLpP3Z1Mq28 tnoL1NE9Ytxs0DHBkvWEFIbbPhhLPVMWLpCKuh92fNuTQrajMZtQOabaqz/ARI4u Ty8uyM0lAkEArCyJaH2rRxFZuT7zrQKhuG9pDb/SDAplDEA1iREZmpWV4ClBN+7+ kMEypx7jz5kdlhN/y4oCS/BAaJgaoc3l3wJBAJBTMDLnfFn0yeZ7nTdXv/AGxmpU A9oB42Wir5aCiXJLrwGZt2cSkdXVJcSVeqX8KVxUB9WgEOKU9MCc+QV/rZ0CQBzE XDkPNjzrkzg2YnR3yhmM09quQCQu4G9JkyhRqRuA/sezXOhBkFsTTKlLqfiXtq/K lkGlz3hsrfZL47dBNbUCQQDHUPfaAXQdbAns9O6s0wwXncaKo1r4QU4ZOQOc3mM0 e15fW/Ya22J2z9DUx8lNwMnoGzqBcVEPdHnFqbUJPZsw -----END RSA PRIVATE KEY-----

相关问题