跳至内容

如何解决 IAM 中与 OIDC IdP 身份联合相关的错误?

4 分钟阅读
0

我想对我在 AWS Identity and Access Management (IAM) 中使用 OpenID Connect (OIDC) 身份提供商 (IdP) 时遇到的错误进行故障排除。

解决方法

当您使用 OIDC IdP 与 IAM 进行身份联合时,您可能会遇到以下错误。

**重要事项:**将 /.well-known/openid-configuration 添加到 OIDC 身份提供商 URL 的末尾,以查看提供者的配置文档和元数据。

**注意:**将 server.example.com 替换为 OIDC 身份提供商的服务器名称。将 oidc_issuer_url 替换为 OIDC 身份提供商的颁发者 URL。

“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account.”(调用 AssumeRoleWithWebIdentity 操作时出错 (InvalidIdentityToken),在您的账户中未找到 OpenIDConnect 提供商。)

当您调用 AssumeRoleWithWebIdentity API 操作时,如果未正确引用 OIDC 身份提供商,就会出现此错误。

要解决此错误,请完成以下步骤:

  1. 检查在调用 AssumeRoleWithWebIdentity API 操作时传递的 OIDC 身份提供商的 ARN。
    注意: 当您使用 AWS 命令行界面 (AWS CLI) 进行配置时,尾部斜杠会自动添加到 OIDC IdP 的 ARN 中。当您使用 AWS SDK 时,不会添加尾部斜杠。
    **注意:**如果在执行 AWS CLI 命令时收到错误消息,请确认您运行的是最新版本的 AWS CLI
  2. 验证 IAM 角色的信任策略是否向通过 OIDC 身份提供商进行身份联合的主体授予信任。
    **重要事项:**不支持跨账户角色。OIDC 身份提供商和 IAM 角色必须在同一个账户中。
  3. 验证在 AWS Security Token Service (AWS STS) 请求中传递的 OIDC 身份提供商 URL 是否与 IAM OIDC 身份提供商 URL 相匹配。AWS STS 请求中的 URL 可能包含在错误消息中。

“Your request has a problem.Please see the following details.Please check .well-known/openid-configuration of provider: oidc_issuer_url is valid.”(您的请求有问题。请查看以下详细信息。请检查提供商 oidc_issuer_url 的 .well-known/openid-configuration 是否有效。)

当 OIDC 身份提供商的 URL 不正确时,就会出现此错误。

要解决此错误,请验证 OIDC 身份提供商的 URL 是否满足以下要求:

  • 该 URL 在您的 AWS 账户中是唯一的。
  • 该 URL 的大小写正确。
  • 该 URL 以 https:// 开头
  • 该 URL 不包含端口号。

如果错误仍然存在,请完成以下步骤:

  1. 在颁发者 URL 的末尾添加一个尾部斜杠 ( / )。
  2. 手动获取 OIDC 身份提供商的指纹
  3. 在 AWS CLI 中创建 OIDC 身份提供商

“Your request has a problem.Please see the following details.Could not connect to openid configuration of provider: oidc_issuer_url.”(您的请求有问题。请查看以下详细信息。无法连接到提供商 oidc_issuer_url 的 openid 配置。)

当 OIDC 身份提供商的颁发者提供的证书链出现故障或包含重复证书或其他证书时,就会出现此错误。

要解决此错误,请完成以下步骤:

  1. 如果需要,安装配置 OpenSSL 命令行工具。
    **注意:**将 keys.example.com 替换为映射到 OIDC 身份提供商元数据中的 jwks_uri 的 URL。

  2. 在 OpenSSL 命令行工具中,运行 openssl-s_client 命令来下载 OIDC 身份提供商的证书链。

    openssl s_client -servername keys.example.com -showcerts -connect keys.example.com:443
  3. 验证 OIDC 身份提供商的证书链。该证书链必须以域或颁发者 URL 开头,然后是中间证书,并以根证书结尾。

如果证书链顺序不同,则会收到签名不匹配错误消息,且 STS 无法验证 JSON Web 令牌 (JWT)。有关证书链标准的更多信息,请参阅 RFC Series 网站上的 RFC 5246 中的 certificate_list

“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: The ID Token provided is not a valid JWT.”(调用 AssumeRoleWithWebIdentity 操作时出错 (InvalidIdentityToken),提供的 ID 令牌不是有效的 JWT。)

当 JWT 经过加密或在 OIDC 身份提供商向 IAM 联合身份时使用不支持的字符时,就会出现此错误。

要解决此错误,请完成以下步骤:

  1. 验证 JWT 标头的参数值的格式是否为“字符串”。 JWT 标头参数值如果是任何其他数据类型,都会导致错误。
  2. 运行在线解码器工具来检查 JWT 标头中传递的信息。
  3. 移除不必要的标头参数值或将数据类型更改为字符串。

**注意:**自定义 OIDC 支持以下签名算法: RS256、RS384、RS512、HS256、HS384 和 HS512。OIDC 通过联合身份验证进入 IAM 不支持加密的 JWT。

“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Couldn't retrieve verification key from your identity provider, please reference AssumeRoleWithWebIdentity documentation for requirements.”(调用 AssumeRoleWithWebIdentity 操作时出错 (InvalidIdentityToken)。无法从您的身份提供商处检索验证密钥,请参阅 AssumeRoleWithWebIdentity 文档了解相关要求。)

您可能由于以下原因而遇到此错误:

  • OIDC 身份提供商的 .well-knownjwks_uri 终端节点无法从公共互联网进行访问。
  • 自定义防火墙正在阻止 API 请求。
  • 从 OIDC 身份提供商向 STS 终端节点发出 API 请求的延迟时间超过 5 秒。
  • 由于 JSON Web Key Set (JWKS) 的大量密钥会阻止 STS 验证 OIDC IdP 的密钥,请求被限流。

要解决此错误,请完成以下步骤:

  1. 验证 OIDC 身份提供商的 .well-knownjwks_uri 终端节点是否可公开访问。
  2. 检查防火墙设置以确认这些域不在拒绝列表中。
  3. 检查整个操作的延迟。如果需要,使用指数回退。
  4. 从 JWKS 中移除不必要的密钥并测试配置。

有关解决此错误的更多信息,请参阅如何解决 AWS STS AssumeRoleWithWebIdentity API 调用错误“InvalidIdentityToken”?

**注意:**这个 InvalidIdentityToken 错误未记录在 AWS CloudTrail 日志文件中,因为故障发生在客户端。

“An unknown error occurred for AssumeRoleWithWebIdentity: Unsupported condition keys used.”(AssumeRoleWithWebIdentity 出现未知错误:使用的条件键不受支持。)

当您在 OIDC 身份提供商的 IAM 角色信任策略中使用不受支持的条件键时,就会出现此错误。

要解决此错误,请使用 AWS Web 身份联合验证的可用键来构建信任策略。

“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: IIncorrect token audience.”(调用 AssumeRoleWithWebIdentity 操作时出错 (InvalidIdentityToken):令牌受众不正确)

当 JWT aud(受众)声明与使用 OIDC 身份提供商的应用程序的唯一标识符不匹配时,就会出现此错误。

要查看 IAM OIDC 提供商的受众,请运行以下命令:

aws iam get-open-id-connect-provider --open-id-connect-provider-arn OIDC_ARN_Example-provider

**注意:**将 OIDC_ARN_Example-provider 替换为您的 OIDC 提供商的 ARN。

受众值必须与应用程序的客户端 ID 相匹配。

“Returned thumbprint (too large for IAM).”(返回的指纹(对于 IAM 来说过大)。)

当您尝试在 IAM 中手动向 OIDC 身份提供商添加不正确的指纹时,就会出现此错误。

要解决此错误,请手动获取您的 OIDC 身份提供商的指纹。

“InvalidIdentityToken: Token audience contains more than one audience while authorized party is not present.”(InvalidIdentityToken:令牌受众包含不止一个受众,而授权方不存在。)

当在 JWT 令牌中定义了多个受众时,就会出现此错误。AWS 不支持具有多个受众的 JWT 令牌,但您可以为 OIDC 身份提供商配置多个客户端 ID 配置作为受众。

要解决此错误,请完成以下步骤:

  1. 确保在 JWT 令牌中仅定义一个受众。
  2. 将您的每个应用程序注册到不同的 OIDC 身份提供商,以允许用户从多个 IdP 登录。
  3. 创建和管理 OIDC 身份提供商,并在需要时为每个受众值配置不同的 IAM 角色。

**注意:**有关 OIDC 身份提供商的更多信息,请参阅为 Web 身份或 OIDC 联合身份创建角色(控制台)

“Unable to configure OpenID Connect configuration with a private application (For example: Gitlab instance).”(无法使用私有应用程序(例如:Gitlab 实例)来配置 OpenID Connect 配置。)

当 OIDC 身份提供商为私有时,就会出现此错误,因为此时 .well-known/openid-configurationjwks_uri 终端节点无法通过互联网公开访问。

要解决此错误,请完成以下步骤:

  1. .well-known/openid-configurationjwks_uri 终端节点配置为可通过互联网访问。
    **注意:**不支持通过代理配置 OIDC 到 IAM 的身份联合。手动添加指纹不起作用,因为随后向 STS 发出的 AssumeRoleWithWebIdentity 请求仍然失败,因为 jwks_uri 终端节点不可公开访问。STS 无法验证 JWT 中的签名来颁发凭证。
  2. 将所需的 AWS IP 地址添加到允许名单。然后使用 AssumeRoleWithWebIdentity API 操作,在您的 AWS 账户中生成临时凭证。使用 AWS IP 地址范围作为 IAM 和 STS 服务地址。
  3. 使用 Amazon Cognito 生成客户端凭证,该凭证可以将您的应用程序身份联合到 Amazon Cognito 用户池。在用户池中,您可以通过可以访问您账户中特定 AWS 角色的 Amazon Cognito 身份池 代入角色。
    您可以使用客户端凭证通过身份验证进入 Amazon Cognito 身份池。借助客户端凭证,您可以为每个应用程序使用唯一的客户端,以区分访问级别。
    **重要事项:**要通过身份验证进入 Amazon Cognito,您可能需要执行额外的编码,因为应用程序任务中必须包含 Amazon Cognito。
  4. 使用私有证书颁发机构来实施 IAM Roles Anywhere
    **注意:**有关私有证书颁发机构的更多信息,请参阅什么是 AWS Private CA?
  5. 为 AWS STS 定义接口 VPC 终端节点,通过 VPC 限制身份验证流量。
    **注意:**有关更多信息,请参阅使用 AWS STS 接口 VPC 终端节点

“OpenIdInvalidIDPResponseException error while obtaining the thumbprint of the IAM OIDC identity provider.”(获取 IAM OIDC 身份提供商的指纹时出现 OpenIdInvalidIDPResponseException 错误。)

当 OIDC 身份提供商的元数据缺少必需的属性时,就会发生此错误。要解决此错误,请完成以下步骤:

  1. 检查 OIDC 身份提供商的元数据和必需的属性。
  2. 如果您发现缺失的属性,请联系 OIDC 身份提供商,探讨缺失的信息。
    注意:有关元数据模式和所需属性的更多信息,请参阅 OpenID Connect 勘误表网页中的获取 OpenID 提供商配置信息

“Invalid login token.OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint.”(登录令牌无效。OpenIDConnect 提供商的 HTTPS 证书与配置的指纹不匹配。)

当 OIDC 身份提供商中使用的指纹过期或与证书颁发机构不匹配时,就会出现此错误。

要解决此错误,请完成以下步骤:

  1. 手动获取指纹
  2. 使用 UpdateOpenIDConnectProviderThumbprint 或 AWS 管理控制台来更新 OIDC 身份提供商的指纹。

“AccessDenied error logged for AssumeRoleWithWebIdentity.”(记录了 AssumeRoleWithWebIdentity 的 AccessDenied 错误。)

您可能由于以下原因而遇到此错误:

  • 请求参数中传递的 IAM 角色 ARN 不正确。
  • 在运行 AssumeRoleWithWebIdentity 操作的主体上配置的权限不足。
  • DurationSeconds 参数值大于 IAM 角色的最大持续时间设置。

要解决此错误,请完成以下步骤:

  1. 确保在 AssumeRoleWithWebIdentity 操作中传递正确的 IAM 角色 ARN。
    **注意:**角色 ARN 区分大小写。
  2. 验证是否设置了必要的 IAM 权限。
  3. 检查服务控制策略 (SCP)。
  4. 验证当请求包含会话标签时,信任策略中是否允许使用 aws:TagSession
  5. 确保 IAM 角色的最大会话持续时间设置始终大于或等于 SessionDuration 参数。
AWS 官方已更新 2 年前