检索 JWT 身份验证的证书/密钥时出现问题。 (节点/Express/C#/IdentityServer)
Posted
技术标签:
【中文标题】检索 JWT 身份验证的证书/密钥时出现问题。 (节点/Express/C#/IdentityServer)【英文标题】:Issue with retrieval of the cert/secret for JWT authentication. (Node/Express/C#/IdentityServer) 【发布时间】:2018-10-25 19:21:02 【问题描述】:在我的节点/express 应用程序的服务器端验证 JWT 时遇到问题。令牌是在 asp.net 核心应用程序的 Identity Server 中生成的。生成的令牌是 RS256 令牌类型,这意味着在 Identity Server 中创建时需要生成私钥和公钥。这对我意味着什么 -
在客户端(Angular)上,一旦登录,我将在所有请求中传递 Bearer 令牌。我需要以某种方式验证该令牌。使用 RS256 令牌类型的方法是确保公钥匹配。我正在使用
const jwt2 = require('jwt-simple');
用于我的 JWT 验证。
问题是秘密,这里是 jwt-simple 文档jwt-simple link。如果我在 decode false 中设置第三个值,它会起作用,因为它忽略了所需的秘密/证书。
我收到此错误 -
错误:错误:0906D06C:PEM 例程:PEM_read_bio:没有起始行
我正在中间件中进行此验证,因此所有端点都会命中它。 我看到了这个问题 - SO Similar Issue 并运行了相同的命令。我仍然收到错误,因为令牌与证书没有任何关系,因为我是从 Identity Server 项目中获取的。所以我需要从该项目中检索证书公钥。
我如何能够在令牌中发送该证书或以某种方式检索该有效证书?希望这有点道理。任何帮助,将不胜感激。
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 做什么吗?为长篇道歉。谢谢。
【问题讨论】:
首先在jwt.io上验证您的令牌 【参考方案1】:我挖了一下,这是我的调查:
来自node-jsonwebtoken docs,您的秘密必须是有效的私钥。
secretOrPrivateKey 是一个字符串、缓冲区或对象,其中包含 HMAC 算法的秘密或 RSA 的 PEM 编码私钥 和 ECDSA。如果是带有密码短语的私钥,则为 object key, 在这种情况下,可以使用密码 (基于加密文档) 确保你通过算法选项
另外,最好在encode
和decode
函数中提供'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);
执行:
$ 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-----
【讨论】:
以上是关于检索 JWT 身份验证的证书/密钥时出现问题。 (节点/Express/C#/IdentityServer)的主要内容,如果未能解决你的问题,请参考以下文章
使用 RSA 算法 Django Rest Framework 简单 JWT 时出现错误无法反序列化密钥数据
UnauthorizedError:身份验证时出现 jwt 格式错误的错误
在 Kubernetes 集群上对 AutoDesk-Forge 进行身份验证时出现 SSL 证书错误
在 AWS EKS 上使用 Kubernetes 身份验证方法部署 Hashicorp Vault 时出现证书错误