如何解決 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 的基本網址。

若要確認您是否能夠存取連結,請檢查請求回應中的 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 的基本網址。

如果發出 AssumeRoleWithWebIdentity API 呼叫的伺服器是 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,請檢查組態設定。如需更多資訊,請參閱為什麼我無法連線到託管在 EC2 執行個體上的網站?

檢查作業延遲

當來自 IdP 的 API 請求到達 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 金鑰集 (JWKS) 設定了 Pragma: no-cacheCache-Control: no-cache 回應標頭,則 STS 不會快取您的 JWKS。STS 會對 ID_TOKEN 中參照但不在快取中的金鑰執行回呼操作。在這種情況下,STS 可能會向您的 .well-known 網址和 jwks_uri 發出過多請求。

若要減少來自 STS 的回呼,請確認您的 JWKS 未設定上述任一個回應標頭。這會允許 STS 快取您的 JWKS。

減少 JWKS 中的金鑰數量

STS 只支援 JWKS 中最多 100 個金鑰。如果您的 JWKS 有超過 100 個金鑰,那麼 STS 將無法驗證使用這些金鑰簽署的權杖。當您呼叫 AssumeRoleWithWebIdentity 且您的 JWKS 有超過 100 個金鑰時,您可能會收到「InvalidIdentityToken」錯誤。

若要解決該錯誤,請從 JWKS 中移除不再需要的金鑰。或者,減少 JWKS 中存在的金鑰數量。

相關資訊

歡迎使用 AWS Security Token Service API 參照

如何解決 IAM 和 AWS STS 的 API 限流或「超過費率」錯誤?

AWS 官方
AWS 官方已更新 1 個月前