我可以在 AWS IAM 上注册具有多个证书的 IDP吗
Can I register an IDP with multiple certificates on AWS IAM
我有的是:
- 提供令牌的 OpenId 投诉服务(Rest)
- 根据请求令牌时的某些因素,此服务有多个用于签署令牌的证书 (keyPairs)
- 该服务正在实施 2 个 OpenId 端点(众所周知和证书)
我做了什么:
- 我在 AWS IAM 服务上成功地将服务注册为 IDP(因此我的两个 OpenId 端点可以正常工作,否则 AWS 不会接受 IDP)
- 我在 IAM 上创建了将使用 IDP 服务令牌承担的角色
- 我从 IDP 服务获得了两个令牌,用于代入角色(每个令牌都使用不同的密钥签名)
问题:
- AssumeRole 失败,我收到两个令牌的无效令牌异常。
我尝试在令牌中设置 "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 的 "claims" 中。
然而事实证明,为了让 AWS 区分这个 JWT 是用这个密钥签名的(来自 jwks 响应),它检查了 JWT 的 headers。如果在 header 中找到孩子,则它会在 jwk 响应中查找具有相应孩子的证书。
所以为了解决这个问题,我只需要在 JWT 的 "headers" 中设置孩子。
所以如果你在 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();
}
我有的是:
- 提供令牌的 OpenId 投诉服务(Rest)
- 根据请求令牌时的某些因素,此服务有多个用于签署令牌的证书 (keyPairs)
- 该服务正在实施 2 个 OpenId 端点(众所周知和证书)
我做了什么:
- 我在 AWS IAM 服务上成功地将服务注册为 IDP(因此我的两个 OpenId 端点可以正常工作,否则 AWS 不会接受 IDP)
- 我在 IAM 上创建了将使用 IDP 服务令牌承担的角色
- 我从 IDP 服务获得了两个令牌,用于代入角色(每个令牌都使用不同的密钥签名)
问题:
- AssumeRole 失败,我收到两个令牌的无效令牌异常。
我尝试在令牌中设置 "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 的 "claims" 中。
然而事实证明,为了让 AWS 区分这个 JWT 是用这个密钥签名的(来自 jwks 响应),它检查了 JWT 的 headers。如果在 header 中找到孩子,则它会在 jwk 响应中查找具有相应孩子的证书。
所以为了解决这个问题,我只需要在 JWT 的 "headers" 中设置孩子。
所以如果你在 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();
}