Como soluciono o erro “InvalidIdentityToken: o certificado HTTPS do provedor OpenIDConnect não corresponde à impressão digital configurada” quando uso a função do IAM do Amazon EKS para acessar a conta de serviço?

Data da última atualização: 09-11-2021

A impressão digital do meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS) foi alterada, fazendo com que as atualizações do controlador do balanceador de carga da aplicação apresentem falhas.

-ou-

Meus pods do Amazon EKS estão no estado com falha e mostram o seguinte erro: “WebIdentityErr: falha ao recuperar credenciais\r\ncausada por: InvalidIdentityToken: o certificado HTTPS do provedor OpenIDConnect não corresponde à impressão digital configurada\r\n”.

Resolução

Todas as contas de serviço do Amazon EKS usam o OpenID Connect (OIDC) para realizar a autenticação. Quando você cria um provedor OIDC do AWS Identity and Access Management (IAM) para o cluster do Amazon EKS, a impressão digital gerada usa o certificado raiz. A autoridade de certificação (CA) raiz da Amazon tem um período de validação de cerca de 25 anos. Você recebe o erro “O certificado HTTPS não corresponde à impressão digital configurada” sob uma das seguintes condições:

  • A impressão digital usada no provedor OIDC expirou.
  • A impressão digital não corresponde à CA.

Para solucionar esse problema e obter uma impressão digital, instale e configure a ferramenta da linha de comando OpenSSL.

Para obter uma impressão digital para o provedor OIDC, faça o seguinte:

1.    Faça o seguinte para encontrar o URL do provedor de identidade (IdP) OIDC:

  1. Abra o console do Amazon EKS.
  2. No painel de navegação, escolha Clusters.
  3. Selecione o cluster que você quer conferir.
  4. Clique na guia Configuration (Configuração).
  5. Observe o URL do provedor OIDC na seção Details (Detalhes).
    Exemplo: https://oidc.eks.us-east-1.amazonaws.com/id/1111222233334444555566667777888F/

Inclua /.well-known/openid-configuration no fim do URL do provedor OIDC para formar o URL do documento de configuração do IdP.

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

Acesse o URL em um navegador da Web e anote o valor de jwks_uri da saída. A saída no navegador será semelhante à seguinte:

{"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.    Use a ferramenta da linha de comando OpenSSL para executar o seguinte comando e exibir todos os certificados usados:

Observação: lembre-se de substituir oidc.eks.us-east-2.amazonaws.com pelo nome do domínio retornado na Etapa 1.

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

A saída será semelhante à seguinte:

[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
---

Se você vir mais de um certificado na saída, procure o último certificado exibido no fim da saída. O último certificado é a CA raiz na cadeia de autoridades de certificação.

3.    Crie um arquivo de certificado (exemplo: certificate.crt) e copie o conteúdo do último certificado para esse arquivo. Depois, execute o seguinte comando:

openssl x509 -in certificate.crt -text

A saída será semelhante à seguinte:

[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

Você pode conferir a validade do certificado pelos valores nos campos Not Before (Não antes) e Not After (Não depois). No resultado, você pode ver que a validade da CA da Amazon é de cerca de 25 anos.

4.    Se a saída indicar que o certificado expirou, renove o certificado com seu provedor OIDC. Após a renovação, execute o seguinte comando usando a ferramenta da linha de comando OpenSSL para obter a impressão digital mais recente:

openssl x509 -in certificate.crt -fingerprint -noout

A saída será semelhante à seguinte:

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

Exclua os dois-pontos (:) desta string para obter a impressão digital final:

9E99A48A9960B14926BB7F3B02E22DA2B0AB7280

-ou-

Execute o seguinte comando para obter a impressão digital mais recente depois de excluir os sinais de ponto-e-vírgula:

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

5.    Se a impressão digital atual tiver expirado, use a impressão digital mais recente da Etapa 4 para substituí-la. É possível fazer isso no console do IAM ou usando a AWS Command Line Interface (AWS CLI).

Para substituir a impressão digital usando o console, faça o seguinte:

  1. Abra o console do IAM.
  2. No painel de navegação, escolha Identity providers (Provedores de identidade).
  3. Escolha o provedor de identidade que você quer atualizar.
  4. Na seção Thumbprints (Impressões digitais), escolha Manage (Gerenciar).
  5. Escolha Add thumbprint (Adicionar impressão digital) e insira o novo valor.
  6. Escolha Save changes (Salvar alterações).

-ou-

Execute um comando semelhante ao seguinte usando a 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

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da interface.