Llamadas a la API que fallan con errores de TLS

Estás viendo la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

Síntoma

Las solicitudes a la API de Apigee hybrid fallan con errores de conexión TLS. Por lo general, estos errores son restablecimientos de conexión y fallas en el protocolo de enlace de alerta.

Mensajes de error

Las llamadas a la API fallan con TLS similar al error que se muestra a continuación, o bien otros errores, pero no 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 posibles

Causa Descripción Instrucciones de solución de problemas aplicables para
Falta el secreto de Kubernetes de Ingress Falta el secreto de Kubernetes para org-envgroup en el espacio de nombres de Apigee. Apigee Hybrid
Certificado SSL con formato incorrecto El certificado SSL que apunta a la sección virtualhosts del archivo de anulación tiene un formato incorrecto. Apigee Hybrid
Las claves SSL no coinciden con el certificado SSL Las claves SSL no coinciden con el certificado SSL que apunta a la sección virtualhosts del archivo de anulación. Apigee Hybrid

Causa: falta el secreto de Kubernetes de Ingress

Diagnóstico

  1. Analiza los registros de los Pods apigee-watcher en el espacio de nombres de Apigee y verifica si hay algún error.

    Es posible que observes un error como el siguiente:
    NOT_FOUND: failed to get secret "MY_HYBRID_PROJECT-ENV_GROUP"
    in namespace "apigee": secrets "MY_HYBRID_PROJECT-ENV_GROUP" not found
    aquí:
    • MY_HYBRID_PROJECT es el nombre de la organización de Apigee hybrid
    • ENV_GROUP es el nombre del grupo de entornos.
    El error anterior indica que apigee-watcher no pudo encontrar el secreto de Kubernetes para el grupo de entorno mencionado anteriormente de la organización de Apigee hybrid.
  2. Usa el siguiente comando para verificar que los secretos de Kubernetes faltan de verdad:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    En este ejemplo, no se muestran objetos Secret de Kubernetes para MY_HYBRID_PROJECT-ENV_GROUP. Es posible que se hayan borrado por error.

Solución

Puedes volver a crear los secretos que faltan de Kubernetes con los certificados TLS y la información de los archivos de claves desde el archivo overrides.yaml:

  1. Ejecuta el siguiente comando para volver a crear los secretos faltantes:
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts

    El resultado del comando anterior debería mostrar que se creó el secreto:

    secret/MY_HYBRID_PROJECT-ENV_GROUP created
  2. Verifica que los secretos de Kubernetes se creen con éxito con el siguiente comando:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP

    El resultado de este comando debería mostrar lo siguiente:

    MY_HYBRID_PROJECT-ENV_GROUP                   Opaque                2      7s

Si el problema persiste, consulta Recopila información de diagnóstico a continuación.

Causa: Certificado SSL con un formato incorrecto

Diagnóstico

Primero, asegúrate de que el archivo de certificado sea un archivo .PEM. Para verificar si el certificado SSL con el formato correcto se cargó en apigee-ingressgateway, sigue estos pasos.

Si configuraste TLS unidireccional con un par de claves/certificado, como se describe en la Opción 1: par de claves/certificado, ejecuta el siguiente comando:

openssl x509 -in $CERT_FILE -text -noout

Este es un resultado de ejemplo (sin errores):

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

Si configuraste TLS unidireccional con un Secret de Kubernetes como se describe en Opción 2: Secret de Kubernetes, ejecuta lo siguiente:

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

Este es un resultado de ejemplo (sin errores):

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

Si el resultado del comando anterior se ve de la siguiente manera:

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 errores como

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

consulta la sección Resolución.

Solución

Los errores pueden variar según el error de formato en el archivo del certificado. Corrige el error del certificado si es necesario.

Si el resultado muestra el certificado en lugar de un error, considera Causa: Las claves SSL no coinciden con el certificado SSL.

Causa: Las claves SSL no coinciden con el certificado SSL

Diagnóstico

Si configuraste TLS unidireccional con par de claves/certificado como se describe en la Opción 1: par de claves/certificado, ejecuta lo siguiente:

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

Este es un resultado de ejemplo (sin errores):

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

Si configuraste TLS unidireccional con el Secret de Kubernetes como se describe en la Opción 2: Secret de Kubernetes, ejecuta lo siguiente:

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)

Este es un resultado de ejemplo (sin errores):

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>

Si el resultado del comando anterior muestra un error como el siguiente:

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

entonces las claves SSL no coinciden con el certificado SSL y consulta la sección Resolución.

Solución

Asegúrate de proporcionar las claves privadas correctas y los certificados SSL correspondientes. Soluciona cualquier problema con la clave privada y el certificado SSL.

Si no ves ningún resultado del comando, el certificado SSL y la clave SSL coinciden.

Se debe recopilar información de diagnóstico

Si el problema persiste después de seguir las instrucciones de esta página, recopila la siguiente información de diagnóstico y proporciónala a Asistencia de Apigee:

  1. El resultado detallado curl completo en el que ves el error.
  2. Captura un tcpdump en la máquina en la que ves los errores y compártelo. Para ello, quita la información sensible y las direcciones IP.
  3. Ten listos toda la topología de red y el flujo de red después de consultar con tu equipo de red para compartirlos con la asistencia de Apigee.