400 Solicitud incorrecta: error de certificado SSL

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Síntoma

La aplicación cliente recibe una respuesta HTTP 400 - Bad request con el mensaje “The SSL Certificate error”. Por lo general, el router perimetral envía este error de una configuración de TLS bidireccional habilitada para la conexión entrante a Apigee Edge.

Mensaje de error

La aplicación cliente obtiene el siguiente código de respuesta:

HTTP/1.1 400 Bad Request

Seguido de la siguiente página de error HTML:

<html>
  <head>
    <title>400 The SSL certificate error</title>
  </head>
  <body bgcolor="white">
    <center> <h1>400 Bad Request</h1>
    </center>
    <center>The SSL certificate error</center>
    <hr>
    <center>nginx</center>
  </body>
</html>

Causas posibles

Las posibles causas de este problema son las siguientes:

Causa Descripción Instrucciones de solución de problemas aplicables a
Certificado de cliente vencido El certificado que envió el cliente está vencido. Usuarios de la nube pública y privada de Edge
El cliente envió un certificado incorrecto Este error se produce si el certificado que envía la aplicación cliente no coincide con el certificado almacenado en el almacén de confianza del router de Edge. Usuarios de la nube pública y privada de Edge
Falta el certificado de raíz del cliente en Truststore Este error se produce si falta el certificado raíz firmado de la CA del cliente en el almacén de confianza del router de Edge. Usuarios de la nube pública y privada de Edge
No se cargaron los certificados de cliente en el router perimetral Este error se produce si los certificados de cliente subidos al almacén de confianza no se cargan en el router. Usuarios de la nube privada perimetral

Causa: certificado de cliente vencido

Este problema suele ocurrir con la TLS de 2 vías, cuando el certificado que envía el cliente vence. En una TLS bidireccional, el cliente y el servidor intercambian sus certificados públicos para realizar el protocolo de enlace. El cliente valida el certificado de servidor, y el servidor valida el certificado de cliente.

En Edge, la TLS bidireccional se implementa en el host virtual, en el que el certificado del servidor se agrega al almacén de claves y el certificado de cliente se agrega a los almacenes de confianza.

Durante el protocolo de enlace TLS, si se descubre que el certificado de cliente está vencido, el servidor enviará el mensaje 400 - Bad request con el mensaje “The SSL Certificate error”.

Diagnóstico

  1. Accede a la IU de Edge y consulta la configuración específica del host virtual (Administrador > Hosts virtuales) para la que se realiza la solicitud a la API o usa la API de administración de Obtener API de host virtual para obtener la definición del host virtual específico.

    Por lo general, un host virtual para la comunicación TLS bidireccional tiene el siguiente aspecto:

    <VirtualHost name="myTLSVHost">
        <HostAliases>
            <HostAlias>api.myCompany.com</HostAlias>
        </HostAliases>
        <Port>443</Port>
        <SSLInfo>
            <Enabled>true</Enabled>
            <ClientAuthEnabled>true</ClientAuthEnabled>
            <KeyStore>ref://myKeystoreRef</KeyStore>
            <KeyAlias>myKeyAlias</KeyAlias>
            <TrustStore>ref://myTruststoreRef</TrustStore>
        </SSLInfo>
    </VirtualHost>
    
  2. Determina la referencia del almacén de confianza que se usa en el host virtual. En el ejemplo anterior, el nombre de referencia del almacén de confianza es myTruststoreRef.

  3. Determina el almacén de confianza al que apunta la referencia del almacén de confianza.
    1. En la IU de Edge, navega a Administrador > Entornos > Referencias y busca el nombre de referencia del almacén de confianza.
    2. Anota el nombre en la columna Reference de la referencia específica del almacén de confianza. Este será tu nombre de almacén de confianza.

      La IU de Edge que muestra una lista de referencias
      Figura 1

      En el ejemplo anterior, ten en cuenta que myTruststoreRef tiene la referencia a myTruststore. Por lo tanto, el nombre del almacén de confianza es myTruststore.

  4. En Administrador > Entornos > Almacenes de claves TLS, en la IU de Edge, navega a Almacén de claves de TLS y busca el almacén de confianza que se encuentra en el paso 3.
  5. Selecciona el certificado en el almacén de confianza específico (determinado en el paso 3, arriba), como se muestra a continuación:

    Figura 2

    El certificado con el alias client-cert-markw del ejemplo anterior muestra que está vencido.

  6. Verifica si el certificado del alias del certificado de tu almacén de confianza está vencido.
  7. Si el certificado no está vencido, ve a Pasos comunes del diagnóstico para las otras causas.

Resolución

Obtén un certificado nuevo y súbelo:

  1. Crea un almacén de confianza nuevo, por ejemplo, myNewTruststore.
  2. Sube el certificado nuevo al almacén de confianza recién creado.
  3. Modifica la referencia de trustore usada en el host virtual específico para que apunte al almacén de confianza nuevo según los pasos que se indican en Modifica una referencia.

    En el ejemplo descrito anteriormente, apunta la referencia myTruststoreRef a myNewTruststore.

Pasos comunes del diagnóstico para las demás causas

  1. Para investigar este problema, deberás capturar paquetes TCP/IP con la herramienta tcpdump.
    1. Si eres usuario de una nube privada, puedes capturar los paquetes de TCP/IP en la aplicación cliente o el router.
    2. Si eres usuario de una nube pública, captura los paquetes de TCP/IP en la aplicación cliente.
    3. Una vez que hayas decidido dónde deseas capturar los paquetes de TCP/IP, usa el siguiente comando tcpdump para capturar los paquetes de TCP/IP:

      tcpdump -i any -s 0 host <IP address> -w <File name>

      Nota: Si tomas los paquetes TCP/IP en el router, usa la dirección IP pública de la aplicación cliente en el comando tcpdump.

      Si tomas los paquetes TCP/IP de la aplicación cliente, usa la dirección IP pública del nombre de host utilizado en el host virtual del comando tcpdump.

      Consulta tcpdump para obtener más información sobre esta herramienta y otras variantes de este comando.

  2. Analiza los paquetes TCP/IP recopilados con la herramienta Wireshark o una herramienta similar con la que estés familiarizado.

A continuación, se muestra el análisis de datos de paquetes TCP/IP de muestra con la herramienta Wireshark:

  1. El paquete n.o 30 de tcpdump (imagen a continuación) muestra que la aplicación cliente (fuente) envió un mensaje “Client Hello” al router (destino).
  2. El paquete n.o 34 muestra que el router confirma el mensaje de Hello del cliente desde la aplicación cliente.
  3. El router envía el “Server Hello” en el paquete n.o 35, envía su certificado y también solicita a la aplicación cliente que envíe su certificado en el paquete n.o 38.
  4. En el paquete n.o 38, donde el router envía el paquete de "solicitud de certificado", consulta la sección "Nombres distinguidos", que proporciona detalles sobre el certificado de cliente, su cadena y las autoridades certificadoras que acepta el router (servidor).
  5. Figura 3
  6. La aplicación cliente envía su certificado en el paquete n.o 41. Revisa la sección Verificación de certificados en el paquete 41 y determina el certificado que envía la aplicación cliente.

    Figura 4
  7. Verifica si el sujeto y el emisor del certificado y su cadena enviada por la aplicación cliente (paquete n.o 41) coinciden con el certificado aceptado y su cadena del router (paquete n.o 38). Si no coinciden, entonces esa es la causa del error. Por lo tanto, el router (servidor) envía la alerta encriptada (paquete n.o 57) seguida de FIN, ACK (paquete 58) a la aplicación cliente y, finalmente, finaliza la conexión.
  8. La falta de coincidencia entre el certificado y su cadena puede deberse a las situaciones que se describen en las siguientes secciones.

Causa: El cliente envió un certificado incorrecto

Esto suele suceder si el sujeto o emisor del certificado o la cadena enviada por la aplicación cliente no coincide con el certificado o su cadena almacenados en el almacén de confianza del router (servidor).

Diagnóstico

  1. Accede a la IU de Edge y consulta la configuración específica del host virtual (Administrador > Hosts virtuales) para la que se realiza la solicitud a la API, o usa la API de administración de Obtener API de host virtual para obtener la definición del host virtual específico.

    Por lo general, un host virtual para la comunicación TLS bidireccional tiene el siguiente aspecto:

        <VirtualHost name="myTLSVHost">
            <HostAliases>
                <HostAlias>api.myCompany.com</HostAlias>
            </HostAliases>
            <Port>443</Port>
            <SSLInfo>
                <Enabled>true</Enabled>
                <ClientAuthEnabled>true</ClientAuthEnabled>
                <KeyStore>ref://myKeystoreRef</KeyStore>
                <KeyAlias>myKeyAlias</KeyAlias>
                    <TrustStore>ref://myCompanyTruststoreRef</TrustStore>
            </SSLInfo>
        </VirtualHost>
    
  2. Determina la referencia del almacén de confianza que se usa en el host virtual.

    En el ejemplo anterior, el nombre de referencia del almacén de confianza es myCompanyTruststoreRef.

  3. Determina el almacén de confianza al que apunta la referencia del almacén de confianza.
    1. En la IU de Edge, navega a Administrador > Referencias de entornos y busca el nombre de referencia del almacén de confianza.
    2. Anota el nombre en la columna Reference de la referencia específica del almacén de confianza. Este será tu nombre de almacén de confianza.

      IU de Edge que muestra la referencia del almacén de confianza.
      Figura 5

      En el ejemplo anterior, observa que myCompanyTruststoreRef tiene la referencia a myCompanyTruststore. Por lo tanto, el nombre del almacén de confianza es myCompanyTruststore.

  4. Obtén los certificados almacenados en el almacén de confianza (determinado en el paso anterior) con las siguientes APIs:
    1. Enumera certificados para una API de almacén de claves o almacén de confianza.

      Esta API enumera todos los certificados en el almacén de confianza específico.

    2. Obtén detalles de certificados de una API de almacén de claves o almacén de confianza.

      Esta API muestra información sobre un certificado específico en el almacén de confianza específico.

  5. Comprueba si el emisor y el sujeto de cada certificado y su cadena almacenada en myCompanyTruststore coinciden con el del certificado y su cadena, como se muestra en los paquetes TCP/IP (consulta el paquete n.o 38) más arriba. Si no hay coincidencia, significa que los certificados subidos al almacén de confianza no se están cargando en el router perimetral. Ve a Causa: Los certificados de cliente no se cargaron en el router perimetral.
  6. Si no se encontraron discrepancias en el paso 5, eso indica que la aplicación cliente no envió el certificado correcto y su cadena.

Resolución

Asegúrate de que la aplicación cliente envíe el certificado correcto y su cadena a Edge.

Causa: Falta el certificado raíz del cliente en el almacén de confianza.

Este error se produce si falta el certificado raíz firmado de la CA del cliente en el almacén de confianza del router de Edge.

Diagnóstico

  1. Accede a la IU de Edge y consulta la configuración específica del host virtual para la que se realiza la solicitud a la API (Administrador > Hosts virtuales > virtual_host) o usa Obtener API de host virtual para obtener la definición del host virtual específico.

    Por lo general, un host virtual para la comunicación TLS bidireccional tiene el siguiente aspecto:

        <VirtualHost name="myTLSVHost">
            <HostAliases>
                <HostAlias>api.myCompany.com</HostAlias>
            </HostAliases>
            <Port>443</Port>
            <SSLInfo>
                <Enabled>true</Enabled>
                <ClientAuthEnabled>true</ClientAuthEnabled>
                <KeyStore>ref://myKeystoreRef</KeyStore>
                <KeyAlias>myKeyAlias</KeyAlias>
                <TrustStore>ref://myCompanyTruststoreRef</TrustStore>
            </SSLInfo>
        </VirtualHost>
    
  2. Determina la referencia del almacén de confianza que se usa en el host virtual. En el ejemplo anterior, el nombre de referencia del almacén de confianza es myCompanyTruststoreRef.
  3. Determina el almacén de confianza real que usa la referencia del almacén de confianza.
  4. En la IU de Edge, navega a Administrador > Entornos > Referencias y busca el nombre de referencia del almacén de confianza.
  5. El nombre del almacén de confianza para la referencia específica del almacén de confianza se encuentra en la columna Referencia.

    Figura 6

    En este ejemplo, observa que myCompanyTruststoreRef tiene myCompanyTruststore en la columna Referencia. Por lo tanto, el nombre del almacén de confianza es myCompanyTruststore.

  6. Obtén los certificados almacenados en el almacén de confianza (determinado en el paso anterior) mediante las siguientes APIs:
    1. Enumera los certificados de una API de almacén de claves o almacén de confianza. Esta API enumera todos los certificados del almacén de confianza.
    2. Obtén detalles del certificado desde una API de almacén de claves o almacén de confianza. Esta API muestra información sobre un certificado específico en el almacén de confianza.
  7. Verifica si el certificado incluye una cadena completa, incluido el certificado raíz que envió el cliente específico, como se ve en los paquetes TCP/IP (consulta la Figura 4). El almacén de confianza debe incluir el certificado raíz, así como el certificado de entidad final o el certificado intermedio y de hoja del cliente. Si falta el certificado raíz válido del cliente en el almacén de confianza, esa es la causa del error.

    Sin embargo, si la cadena de certificados completa del cliente, incluido el certificado raíz, existe en el almacén de confianza, significa que es posible que los certificados subidos al almacén de confianza no estén cargados en el router perimetral. Si ese es el caso, consulta Causa: No se cargaron los certificados de cliente en el router perimetral.

Resolución

Asegúrate de que el certificado del cliente correcto, incluido el certificado raíz, esté disponible en el almacén de confianza del router de Apigee Edge.

Causa: No se cargaron los certificados de cliente en el router perimetral

  1. Si eres usuario de una nube pública, comunícate con el equipo de asistencia de Apigee Edge.
  2. Si eres usuario de una nube privada, sigue las siguientes instrucciones en cada router:
    1. Verifica si existe el archivo /opt/nginx/conf.d/OrgName_envName_vhostName-client.pem para el host virtual específico. Si el archivo no existe, ve a la sección Resolución que aparece más abajo.
    2. Si el archivo existe, usa el siguiente comando de openssl para obtener los detalles de los certificados disponibles en el router perimetral:
      openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
    3. Verifica la entidad emisora, el asunto y la fecha de vencimiento del certificado. Si alguno de estos elementos no coincide con lo que se observó en Truststore en la IU de Edge o con el uso de las APIs de administración, esa es la causa del error.
    4. Es posible que el router no haya vuelto a cargar los certificados subidos.

Resolución

Reinicia el router para asegurarte de que los últimos certificados se carguen mediante el siguiente paso:

apigee-service edge-router restart

Vuelve a ejecutar las APIs y verifica los resultados. Si el problema persiste, ve a Recopilar información de diagnóstico.

Recopilar información de diagnóstico

Si el problema persiste, incluso después de seguir las instrucciones anteriores, recopila la siguiente información de diagnóstico. Comunícate con el equipo de asistencia de Apigee Edge y compártela:

  1. Si eres usuario de la nube pública, proporciona la siguiente información:
    1. Nombre de la organización
    2. Nombre del entorno
    3. Nombre de proxy de API
    4. Nombre del host virtual
    5. Nombre del alias del host
    6. Completa el comando curl para reproducir el error
    7. Paquetes TCP/IP capturados en la aplicación cliente
  2. Si eres usuario de una nube privada, proporciona la siguiente información:
    1. Nombre del host virtual y su definición mediante la API del host virtual
    2. Nombre del alias del host
    3. Se observó un mensaje de error completo
    4. Paquetes TCP/IP capturados en el router o la aplicación cliente.
    5. Resultado de la API de Enumera los certificados de la API del almacén de claves y, también, los detalles de cada certificado obtenido con la API de Get cert details.
  3. Detalles sobre las secciones de esta guía que probaste y cualquier otra información que nos ayude a resolver este problema rápidamente.