使用 Amazon EKS IAM 角色存取服務帳戶時,如何解決「InvalidIdentityToken - OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint」(InvalidIdentityToken - OpenIDConnect 提供者的 HTTPS 憑證與設定的指紋不符) 錯誤問題?

上次更新日期:2021 年 11 月 9 日

我的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集的指紋已變更,造成 Application Load Balancer 控制器更新失敗。

-或-

我的 Amazon EKS Pod 為失敗狀態,並出現以下錯誤:「WebIdentityErr: failed to retrieve credentials\r\ncaused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint\r\n」(WebIdentityErr:無法擷取憑證\r\n原因為:InvalidIdentityToken:OpenIDConnect 提供者的 HTTPS 憑證與設定的指紋不符\r\n)。

解決方案

所有 Amazon EKS 服務帳戶都使用 OpenID Connect (OIDC) 進行驗證。為 Amazon EKS 叢集建立 AWS Identity and Access Management (IAM) OIDC 提供者時,產生的指紋會使用根憑證。Amazon 根憑證授權單位 (CA) 的驗證期約為 25 年。發生以下情況時,會出現「HTTPS certificate doesn't match configured thumbprint」(HTTPS 憑證與設定的指紋不符) 錯誤:

  • OIDC 提供者使用的指紋已過期。
  • 指紋與 CA 不符。

如果要解決這個問題並取得指紋,您必須安裝設定 OpenSSL 命令列工具。

如果要取得 OIDC 提供者的指紋,請執行以下動作:

1.    執行以下動作,尋找 OIDC 身分提供者 (IdP) 的 URL:

  1. 開啟 Amazon EKS 主控台
  2. 在導覽窗格中,選擇 Clusters (叢集)
  3. 選取您要檢查的叢集。
  4. 按一下 Configuration (組態) 索引標籤。
  5. 記下 Details (詳細資訊) 區段下的 OICD 提供者 URL。
    範例:https://oidc.eks.us-east-1.amazonaws.com/id/1111222233334444555566667777888F/

在 OICD 提供者 URL 結尾加入 /.well-known/openid-configuration,以形成 IdP 組態文件的 URL。

範例:https://oidc.eks.us-east-1.amazonaws.com/id/1111222233334444555566667777888F/.well-known/openid-configuration

在 web 瀏覽器中存取此 URL,並記下輸出中 jwks_uri 的值。瀏覽器輸出應該看起來如下:

{"issuer":"https://oidc.eks.us-east-1.amazonaws.com/id/1111222233334444555566667777888F","jwks_uri":"https://oidc.eks.us-east-1.amazonaws.com/id/1111222233334444555566667777888F/keys","authorization_endpoint":"urn:kubernetes:programmatic_authorization","response_types_supported":["id_token"],"subject_types_supported":["public"],"claims_supported":["sub","iss"],"id_token_signing_alg_values_supported":["RS256"]}

2.    使用 OpenSSL 命令列工具執行以下命令,以顯示所有使用的憑證:

注意:請務必將 oidc.eks.us-east-2.amazonaws.com 取代為步驟 1 所傳回的網域名稱。

openssl s_client -connect oidc.eks.us-east-2.amazonaws.com:443 -showcerts

輸出應該看起來如下:

[root@ip-172-31-1-202 ~]# openssl s_client -connect oidc.eks.us-east-2.amazonaws.com:443 -showcerts
CONNECTED(00000003)
depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
verify return:1
depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
verify return:1
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = *.execute-api.us-east-2.amazonaws.com
verify return:1
---
Certificate chain
 0 s:/CN=*.execute-api.us-east-2.amazonaws.com
   i:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
-----BEGIN CERTIFICATE-----
CERTIFICATE Redacted
-----END CERTIFICATE-----
 1 s:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
   i:/C=US/O=Amazon/CN=Amazon Root CA 1
-----BEGIN CERTIFICATE-----
CERTIFICATE Redacted
-----END CERTIFICATE-----
 2 s:/C=US/O=Amazon/CN=Amazon Root CA 1
   i:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
-----BEGIN CERTIFICATE-----
CERTIFICATE Redacted
-----END CERTIFICATE-----
 3 s:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
   i:/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority
-----BEGIN CERTIFICATE-----
MIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV
BAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw
MAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV
UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp
ZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/
y8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N
Tm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo
Ot+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C
zyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J
Q4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB
AAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O
BBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV
rNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u
c3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud
HwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG
BFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G
VfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1
l08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt
8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ
59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu
VsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cEXAMPLE=
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=*.execute-api.us-east-2.amazonaws.com
issuer=/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
---

如果您在輸出中看到多個憑證,請尋找輸出結尾顯示的最後一個憑證。最後一個憑證是憑證授權單位鏈中的根 CA。

3.    建立憑證檔案 (範例:certificate.crt),並將最後一個憑證的內容複製到此檔案。執行以下命令:

openssl x509 -in certificate.crt -text

輸出應該看起來如下:

[root@ip-172-31-1-202 ~]# openssl x509 -in certificate.crt -text
Certificate:    Data:
        Version: 3 (0x2)
        Serial Number:
            a7:0e:4a:4c:34:82:b7:7f
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority
        Validity
            Not Before: Sep  2 00:00:00 2009 GMT
            Not After : Jun 28 17:39:16 2034 GMT

您可以在 Not Before (不早於)Not After (不晚於) 欄位的值檢查憑證的有效性。從輸出中,你可以看到 Amazon CA 的有效性大約是 25 年。

4.    如果輸出顯示憑證已過期,您必須向您的 OIDC 提供者更新憑證。更新憑證之後,請使用 OpenSSL 命令列工具執行以下命令,以取得最新的指紋:

openssl x509 -in certificate.crt -fingerprint -noout

輸出應該看起來如下:

SHA1 Fingerprint=9E:99:A4:8A:99:60:B1:49:26:BB:7F:3B:02:E2:2D:A2:B0:AB:72:80

從此字串中刪除冒號 (:) 以取得最終的指紋:

9E99A48A9960B14926BB7F3B02E22DA2B0AB7280

-或-

排除分號後,執行以下命令以取得最新的指紋:

$ openssl x509 -in certificate.crt -fingerprint -noout | sed s/://g

5.    如果目前的指紋已過期,請使用步驟 4 中的最新指紋取代。您可以從 IAM 主控台或使用 AWS Command Line Interface (AWS CLI) 執行此操作。

如果要使用主控台取代指紋,請執行以下動作:

  1. 開啟 IAM 主控台
  2. 在導覽窗格中,選擇 Identity providers (身分提供者)
  3. 選擇您要更新的身分提供者。
  4. Thumbprints (指紋) 區段中,選擇 Manage (管理)
  5. 選擇 Add thumbprint (新增指紋),然後輸入新的值。
  6. 選擇 Save Changes (儲存變更)

-或-

使用 AWS CLI 執行類似以下的命令:

aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/5ECB2797CB1324A37FC79E3C46851CED --thumbprint-list 9E99A48A9960B14926BB7F3B02E22DA2B0AB7280

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI