如何解决 AWS STS AssumeRoleWithWebIdentity API 调用错误“InvalidIdentityToken”?

2 分钟阅读
0

AWS Security Token Service (AWS STS) API 调用 AssumeRoleWithWebIdentity 失败,出现“InvalidIdentityToken”错误。

简短描述

如果您的 AssumeRoleWithWebIdentity API 调用失败,那么您可能会收到一条类似于以下消息的错误:

“调用 AssumeRoleWithWebIdentity 操作时出错 (InvalidIdentityToken)。无法从您的身份提供者处检索验证密钥。”

此错误可能发生在以下情况下:

  • 无法通过公共互联网访问身份提供者 (IdP) 的 .well_known URL 和 jwks_uri。
  • 自定义防火墙阻止了相应请求。
  • API 请求从 IdP 到达 AWS STS 端点时的延迟超过 5 秒。
  • STS 向 IdP 的 .well_known URL 或 jwks_uri 发出的请求数量过多。

**注意:**由于此问题是在客户端出现的,因此 AWS CloudTrail 事件历史记录不会记录此错误。

解决方法

验证 .well_known 和 jwks_uri 的公共访问权限

验证 IdP 的 .well_known URL 和 jwks_uri 是否可以公开访问。可以使用您的浏览器、Windows 命令或 Linux 命令进行验证。为此,请完成以下操作中的一项:

要查看访问权限,请在浏览器中导航到以下链接:

  • https://BASE_SERVER_URL/.well-known/openid-configuration
  • https://BASE_SERVER_URL/.well-known/jwks.json

-或者-

运行以下命令:

Windows:

wget https://BASE_SERVER_URL/.well-known/openid-configuration
wget https://BASE_SERVER_URL/.well-known/jwks.json

Linux:

curl https://BASE_SERVER_URL/.well-known/openid-configuration
curl https://BASE_SERVER_URL/.well-known/jwks.json

**注意:**要确认您是否可以访问链接,请检查请求响应中的 200 状态码。

检查防火墙设置

如果无法访问 IdP 的 .well_known URL 和 jwks_uri,请检查防火墙设置。确保域不在拒绝列表中。

根据防火墙的当前配置,可能需要将域添加到允许列表中。

如果无法访问防火墙设置,请在来自其他网络的设备(例如手机)上使用浏览器。要查看浏览器的访问权限,请按照步骤 1 中的说明进行操作。如果 Web 请求成功,则说明防火墙阻止了该请求。

如果调用 AssumeRoleWithWebIdentity API 的服务器是 Amazon Elastic Compute Cloud (Amazon EC2) 实例,请检查配置设置。有关说明,请参阅为什么我无法连接到我的 EC2 实例上托管的网站?

检查操作延迟情况

检查整个操作的延迟情况。这包括以下属性:

  • 来自 STS 的请求/响应时间
  • 来自 IdP 的请求/响应时间

最小化 STS 延迟

对于 STS 服务,请使用 AWS 区域端点,切勿使用全球端点。这将验证请求是否已路由到地理位置最近的服务器,以最大限度地减少延迟。有关详细信息,请参阅编写代码以使用 AWS STS 区域

**注意:**对于 AWS SDK,Region 参数将请求的目标端点路由到在 sts_regional_endpoint 配置中进行调用的位置。

评估 IdP 延迟

IdP 向 STS 端点发出请求。要检查对 STS 端点的请求是否耗时过长,请分析 IdP 日志中的 IdP 传出数据包。

**注意:**如果从 IdP 到 STS 端点的请求耗时超过 5 秒,则说明请求可能会超时并失败。您可以联系您的身份提供者请求提高地理可用性,以减少此 API 调用的延迟。

(可选)使用指数回退并增加重试次数

AssumeRoleWithWebIdentity API 需要通过身份提供者 (IdP) 检索信息。为了避免出现节流错误,大多数 IdP 都有 API 限制,因此,API 调用可能无法从 IdP 取回所需的密钥。如果 API 在连接您的 IdP 时出现间歇性问题,请按照以下步骤进行操作,以便成功代入某角色:

减少对 .well_known 和 jwks_uri 的 STS 请求

如果您的 JSON Web Key Set (JWKS) 设置了 Pragma: no-cacheCache-Control: no-cache 响应标头,则 STS 不会缓存您的 JWKS。对于在 ID_TOKEN 中引用但不在缓存中的密钥,STS 会执行回调。在这种情况下,STS 可能会对您的 .well_known URL 和 jwks_uri 发出过多请求。

因此,为了减少来自 STS 的回调,请确认您的 JWKS 未设置其中任何一个响应标头。这样,STS 就会缓存您的 JWKS。

相关信息

欢迎使用 AWS Security Token Service API 参考

如何解决 IAM 和 AWS STS 的 API 节流或“超出速率”错误?

AWS 官方
AWS 官方已更新 1 年前