在后端Web服务位于单独的服务器上并且需要确定给定请求通过APIM网关身份验证的情况下,验证特定API Manager实例是否发出JWT的推荐方法是什么?授权机制?
我知道JWT中的标题字段包含一个'x5t'字段,它是对租户密钥存储区中证书的编码引用,详见此处:
https://asankastechtalks.wordpress.com/2013/12/05/obtaining-certificate-used-to-sign-a-jwt/
由于后端Web服务位于单独的服务器上,我们是否需要以某种方式将公钥分发给它?另外,我们如何更新用于签署JWT的证书,因为它现在使用默认值?
答案 0 :(得分:1)
x5t中的数据不是整个证书,它只是一个哈希,可以帮助您确定您拥有的证书是否相同。这意味着您需要将公共证书上载到接收服务。
使用https可以在握手中检索公共证书,然后客户端可以检查此证书是否由受信任的CA签名。然而,通过此验证,没有这样的机制,因此您不能只信任您必须信任每个公共证书的CA.
还有另一个可选标题'x5u',其中包含指向公共证书的URL链接,但APIM未设置该值。
答案 1 :(得分: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];
答案 2 :(得分:0)
我认为您可以通过在身份提供者下的API管理器中导入证书来验证JWT。
想象一下,您正在使用Wso2 IS生成JWT令牌,那么您需要导出IS证书并将其导入wso2 api管理器中。并且您必须验证密钥“ IDTokenIssuerID”在IS和API中是否相同经理