当我使用 Amazon EKS IAM 角色访问服务账户时,如何排查错误“InvalidIdentityToken – OpenIDConnect 提供程序的 HTTPS 证书与配置的指纹不匹配”?

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

我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群的指纹已更改,导致 Application Load Balancer 控制器更新失败。

-或者-

我的 Amazon EKS Pod 处于失败状态,并显示以下错误:“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 证书与配置的指纹不匹配”:

  • 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