7

在后端 Web 服务位于单独的服务器上并且需要确定给定请求通过 APIM 网关身份验证和授权机制传递的情况下,验证 JWT 是否由特定 API Manager 实例发出的推荐方法是什么?

我知道 JWT 中的标头字段包含一个“x5t”字段,它是对租户密钥存储中证书的编码引用,如下所述:

https://asankastechtalks.wordpress.com/2013/12/05/obtaining-certificate-used-to-sign-a-jwt/

由于后端 Web 服务位于单独的服务器上,我们是否需要以某种方式将公钥分发给它?此外,我们如何更新用于签署 JWT 的证书,因为它现在使用默认值?

4

3 回答 3

2

x5t 中的数据并不是整个证书,它只是一个哈希值,可以帮助您识别您拥有的证书是否相同。这意味着您确实需要将公共证书上传到接收服务。

使用 https 可以在握手中检索公共证书,然后客户端可以检查此证书是否由受信任的 CA 签名。但是,通过此验证,没有这样的机制,因此您不能只信任 CA,您必须信任每个公共证书。

还有另一个可选标头“x5u”,其中包含指向公共证书的 url 链接,但 APIM 未设置该值。

于 2015-06-18T19:26:30.833 回答
1

这是您可以使用 WSO2 令牌中的 x5t 哈希作为查找从本地存储获取证书的方式:

// Use JwtSecurityTokenHandler to validate the JWT token
var tokenHandler = new JwtSecurityTokenHandler();

// Read the JWT
var parsedJwt = tokenHandler.ReadToken(token);

// Get X509 public certificate
var signerAlgorithm = ((JwtSecurityToken)parsedJwt).SignatureAlgorithm;
var signerHash = ((JwtSecurityToken)parsedJwt).Header["x5t"];
var thumbprint = Encoding.UTF8.GetString(Convert.FromBase64String(signerHash.ToString()));

X509Store store = new X509Store(StoreName.TrustedPublisher);
store.Open(OpenFlags.ReadOnly);
var cert = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false)[0];
于 2015-10-30T14:50:52.077 回答
0

我认为您可以通过在身份提供者下的 API 管理器中导入证书来验证 JWT。

假设您正在使用 Wso2 IS 生成 JWT 令牌,那么您需要导出 IS 的证书并将其导入 wso2 api manager.. 并且您必须验证密钥 'IDTokenIssuerID' 在 IS 和 API Manager 中是否相同

我认为这篇文章可以帮助您理解:https ://medium.com/wso2-learning/how-to-protect-your-apis-with-self-contained-access-token-jwt-using-wso2-api-manager -and-wso2-75673d8a4686

于 2019-01-17T19:47:22.573 回答