0

我所拥有的是:

  • 提供令牌的 OpenId 投诉服务 (Rest)
  • 此服务有多个证书(keyPairs)用于签署令牌,具体取决于请求令牌时的某些因素

    - 该服务正在实施 2 个 OpenId 端点(众所周知和证书)

我做了什么:

  • 我成功地将服务注册为 AWS IAM 服务上的 IDP(因此我的两个 OpenId 端点正在工作,否则 AWS 不会接受 IDP)
  • 我在 IAM 上创建了要使用 IDP 服务令牌承担的角色
  • 我从 IDP 服务中获得了两个用于担任角色的令牌(每个都使用不同的密钥签名)

问题:

  • AssumeRole 失败,我得到两个令牌的无效令牌异常。

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

笔记:

  • 我正在使用 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"
        }
    ]
}
4

1 回答 1

0

所以问题是我试图将孩子置于 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();
}
于 2020-02-11T18:42:45.387 回答