跳至内容

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

2 分钟阅读
0

AWS Security Token Service (AWS STS) AssumeRoleWithWebIdentity API 调用失败,并显示“InvalidIdentityToken”错误。我想对此错误进行故障排除。

解决方法

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

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

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

验证 .well-known 和 jwks_uri 的公共访问权限

如果您无法访问身份提供者 (IdP).well-known URL 和 jwks_uri,则您可能会收到错误。验证您是否可以公开访问 IdP 的 .well-known URL 和 jwks_uri

要检查可访问性,请在浏览器中导航到以下链接:

  • 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-configurationwget https://BASE_SERVER_URL/.well-known/jwks.json

对于 Linux:

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

**注意:**请将 BASE_SERVER_URL 替换为您的 IdP 的基本 URL。

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

检查防火墙设置

如果您无法访问 IdP 的 .well-known URL 和 jwks_uri,请检查防火墙设置。确保域不在拒绝列表中。根据防火墙的当前配置,可能需要将域添加到允许列表中。

如果自定义防火墙阻止了请求,则您可能会收到错误。

如果您无法访问防火墙设置,请在使用其他网络的设备(例如手机)上使用浏览器。

在浏览器中导航到以下链接:

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

**注意:**请将 BASE_SERVER_URL 替换为您的 IdP 的基本 URL。

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

检查操作延迟情况

当 API 请求从 IdP 到达 AWS STS 端点的延迟超过 5 秒时,您可能会收到错误。

检查整个操作的延迟。这包括来自 STS 的请求和响应时间,以及来自 IdP 属性的请求和响应时间。

最小化 STS 延迟

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

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

评估 IdP 延迟

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

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

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

IdP 通过提供信息来支持 AssumeRoleWithWebIdentity。大多数 IdP 都具有 API 限制以避免出现节流错误,且 IdP 可能不会从 API 调用中返回所需的密钥。如果 API 在访问您的 IdP 时出现间歇性问题,请使用以下故障排除选项:

  • 使用指数回退
  • 增加重试次数,然后设置最大重试次数。另外,实施最大延迟间隔。有关详细信息,请参阅重试行为

减少对 .well-known 和 jwks_uri 的 STS 请求

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

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

减少您的 JWKS 中的密钥数量

STS 在 JWKS 中最多只能支持 100 个密钥。如果您的 JWKS 包含超过 100 个密钥,则 STS 将无法验证使用您的密钥签名的令牌。当您调用 AssumeRoleWithWebIdentity,且您的 JWKS 包含超过 100 个密钥时,您可能会收到“InvalidIdentityToken”错误。

要解决此错误,请从您的 JWKS 中删除不再需要的密钥。或者,减少您的 JWKS 中存在的密钥数量。

相关信息

Welcome to the AWS Security Token Service API Reference

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

AWS 官方已更新 8 个月前