我是否可以在 AWS IAM 上注册具有多个证书的 IDP



我所拥有的是:

  • 提供令牌的OpenId投诉服务(Rest(
  • 此服务具有多个证书(密钥对(,用于对令牌进行签名,具体取决于请求令牌时的某些因素

    - 该服务正在实现 2 个 OpenId 端点(已知和证书(

我做了什么:

  • 我已成功将该服务注册为 AWS IAM 服务上的 IDP(因此我的两个 OpenId 终端节点正在工作,其他明智的 AWS 不会接受 IDP(
  • 我在 IAM 上创建了将使用 IDP 服务令牌代入的角色
  • 我从 IDP 服务中获得了两个用于担任角色的令牌(每个令牌使用不同的密钥签名(

问题:

  • 假设角色失败,我收到两个令牌的无效令牌异常。

我尝试在令牌中设置"kid"声明,每个令牌都有证书的相应孩子,但它:(不起作用。

注意:

  • 我正在使用Java AWS API承担角色
  • 当我删除其中一个证书(从下面的示例响应中(时,剩余的证书工作正常。所以问题在于拥有 2 个证书,但我需要有并且 AWS 应该有一种处理这种情况的方法,我只是不知道如何。

我的证书终结点的外观示例:

{  
"keys": [
{
"kid": "kid",
"kty": "kty",
"use": "use",
"alg": "alg",
"n": "nValue",
"e": "eValue",
"x5c": [
"cert1"
],
"x5t": "x5t=",
"x5t#S256": "x5t#S256"
},
{
"kid": "kid1",
"kty": "kty",
"use": "use",
"alg": "alg",
"n": "nValue",
"e": "eValue",
"x5c": [
"cert2"
],
"x5t": "x5t=",
"x5t#S256": "x5t#S256"
}
]
}

所以问题是我试图将孩子放在 JWT 的"声明"中。

然而,事实证明,为了让AWS区分这个JWT是用这个密钥签名的(从jwks响应(,它会检查JWT的标头。如果在标头中找到孩子,则它会在 jwk 响应中查找具有相应孩子的证书。

因此,为了解决这个问题,我只需要在 JWT 的"标题"中设置孩子。

所以如果你在java:

public String buildToken(Key key) {
Map<String, Object> claims = new HashMap();
Map<String, Object> headers = new HashMap();
claims.put(claimName, someClaim);
...
headers.put(KID, KID_OF_THIS_TOKENS_CERTIFICATE);
...
return Jwts.builder().setClaims(claims).setHeader(headers).signWith(SignatureAlgorithm.RS256, key).compact();
}

最新更新