As chamadas API estão a falhar com erros de TLS

Está a ver a documentação do Apigee e do Apigee Hybrid.
Veja a documentação do Apigee Edge.

Sintoma

Os pedidos de API híbrida do Apigee falham com erros de ligação TLS. Normalmente, estes erros são reposições de ligação e falhas de handshake de alerta.

Mensagens de erro

As chamadas da API falham com TLS semelhante ao erro apresentado abaixo ou outros erros, mas não idênticos:

* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* (304) (OUT), TLS handshake, Client hello (1):
* Recv failure: Connection reset by peer
* LibreSSL/3.3.6: error:02FFF036:system library:func(4095):Connection reset by peer
* Closing connection
curl: (35) Recv failure: Connection reset by peer
* (304) (OUT), TLS handshake, Client hello (1):
* LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure
* Closing connection
curl: (35) LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure

Causas possíveis

Causa Descrição Instruções de resolução de problemas aplicáveis a
Segredo do Kubernetes de entrada em falta O segredo do Kubernetes para org-envgroup está em falta no espaço de nomes do Apigee. Apigee Hybrid
Certificado SSL com formatação incorreta O certificado SSL indicado na secção virtualhosts do ficheiro de substituições tem um formato incorreto. Apigee Hybrid
As chaves SSL não correspondem ao certificado SSL As chaves SSL não correspondem ao certificado SSL indicado na secção virtualhosts do ficheiro de substituições. Apigee Hybrid

Causa: secret do Kubernetes de entrada em falta

Diagnóstico

  1. Analise os registos dos pods apigee-watcher no espaço de nomes apigee e verifique se existem erros.

    Pode observar um erro como o seguinte:
    NOT_FOUND: failed to get secret "MY_HYBRID_PROJECT-ENV_GROUP"
    in namespace "apigee": secrets "MY_HYBRID_PROJECT-ENV_GROUP" not found
    where:
    • MY_HYBRID_PROJECT é o nome da organização do Apigee Hybrid
    • ENV_GROUP é o nome do grupo de ambientes
    O erro acima indica que apigee-watcher não conseguiu encontrar o segredo do Kubernetes para o grupo de ambientes mencionado acima da organização híbrida do Apigee.
  2. Verifique se os segredos do Kubernetes estão realmente em falta através do seguinte comando:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    Este exemplo não mostra secrets do Kubernetes para MY_HYBRID_PROJECT-ENV_GROUP. Estas podem ter sido eliminadas por engano.

Resolução

Pode recriar os segredos do Kubernetes em falta com as informações dos ficheiros de chaves e certificados TLS do ficheiro overrides.yaml:

  1. Execute o seguinte comando para recriar os segredos em falta através do Helm:

    Execução de ensaio:

    helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    --set envgroup=ENV_GROUP \
    -f OVERRIDES_FILE \
    --dry-run=server
    

    Certifique-se de que inclui todas as definições apresentadas, incluindo --atomic para que a ação seja revertida em caso de falha.

    A sua instalação pode ou não ter sido configurada através de um ENV_GROUP_RELEASE_NAME diferente de ENV_GROUP. Para ver informações sobre as definições, consulte o artigo Instale o Apigee hybrid com o Helm.

    Instale o gráfico:

    helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    --set envgroup=ENV_GROUP \
    -f OVERRIDES_FILE
    
  2. Verifique se os segredos do Kubernetes foram criados com êxito através do seguinte comando:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP

    O resultado deste comando deve mostrar:

    MY_HYBRID_PROJECT-ENV_GROUP                   Opaque                2      7s

Se o problema persistir, aceda a Informações de diagnóstico obrigatórias.

Causa: certificado SSL formatado incorretamente

Diagnóstico

Primeiro, certifique-se de que o ficheiro de certificado é um ficheiro .PEM. Para verificar se o certificado SSL formatado corretamente foi carregado no apigee-ingressgateway, siga estes passos.

Se configurou o TLS unidirecional com um par de certificado/chave, conforme descrito na Opção 1: par de chave/certificado, execute:

openssl x509 -in $CERT_FILE -text -noout

Um exemplo de resultado (sem erros):

Certificate:
  Data:
    Version: 1 (0x0)
    Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN
    Validity
      Not Before: Dec 18 09:40:23 2023 GMT
      Not After : May  1 09:40:23 2025 GMT
    Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com
    Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
        RSA Public-Key: (2048 bit)
        Modulus:
          Trimmed
        Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
          Trimmed

Se configurou o TLS unidirecional através de um secret do Kubernetes, conforme descrito na Opção 2: secret do Kubernetes, execute:

kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d > certfile ;
openssl x509 -in certfile -text -noout

kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -text

Um exemplo de resultado (sem erros):

Certificate:
  Data:
    Version: 1 (0x0)
    Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN
    Validity
      Not Before: Dec 18 09:40:23 2023 GMT
      Not After : May  1 09:40:23 2025 GMT
    Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com
    Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
        RSA Public-Key: (2048 bit)
        Modulus:
          Trimmed
        Exponent: 65537 (0x10001)
  Signature Algorithm: sha1WithRSAEncryption
          Trimmed

Se o resultado do comando acima for semelhante a

unable to load certificate
136613728412992:error:0D078095:asn1 encoding routines:asn1_item_embed_d2i:sequence not constructed:../crypto/asn1/tasn_dec.c:321:Type=X509
136613728412992:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:../crypto/pem/pem_oth.c:33:

Para erros como

error loading certificates
8360934016:error:09FFF066:PEM routines:CRYPTO_internal:bad end line

Consulte a secção Resolução.

Resolução

Os erros podem variar consoante o erro de formato no ficheiro de certificado. Corrija o erro de certificado, se necessário.

Se o resultado mostrar o certificado em vez de um erro, considere o seguinte: Causa: as chaves SSL não correspondem ao certificado SSL.

Causa: as chaves SSL não correspondem ao certificado SSL

Diagnóstico

Se configurou o TLS unidirecional com um par de certificado/chave, conforme descrito na Opção 1: par de chave/certificado, execute:

diff -q <(openssl rsa -noout -modulus -in $KEY_FILE ) <(openssl x509 -noout -modulus -in $CERT_FILE)

Um exemplo de resultado (sem erros):

diff -q <(openssl rsa -noout -modulus -in my_server.key ) <(openssl x509 -noout -modulus -in my_server.pem)
<No output>

Se configurou o TLS unidirecional através do secret do Kubernetes, conforme descrito na Opção 2: secret do Kubernetes, execute:

diff -q <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)

Um exemplo de resultado (sem erros):

diff -q <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)
<No output>

Se o resultado do comando acima mostrar um erro como:

unable to load Private Key
133504499987776:error:09091064:PEM routines:PEM_read_bio_ex:bad base64 decode:../crypto/pem/pem_lib.c:949:
Files /dev/fd/63 and /dev/fd/62 differ

as chaves SSL não correspondem ao certificado SSL. Consulte a secção de Resolução.

Resolução

Certifique-se de que está a fornecer as chaves privadas corretas e os respetivos certificados SSL. Corrija quaisquer problemas de chave privada e certificado SSL.

Se não vir qualquer resultado do comando, o certificado SSL e a chave SSL correspondem.

Informações de diagnóstico necessárias

Se o problema persistir depois de seguir as instruções nesta página, recolha as seguintes informações de diagnóstico e faculte-as ao apoio técnico do Apigee:

  1. O resultado detalhado curl completo em que vê o erro.
  2. Capture um tcpdump na máquina em que está a ver os erros e partilhe-o removendo todas as informações confidenciais e endereços IP.
  3. Tenha a topologia de rede completa e o fluxo de rede prontos após consultar a sua equipa de rede para partilhar com o apoio técnico do Apigee.