Saltar al contenido
ecdsa.com
nginxOtras herramientas

Mensaje de error

400 No required SSL certificate was sent

También se muestra como

  • client sent no required SSL certificate while reading client request headers

El título de la página es «400 No required SSL certificate was sent»; con un certificado que no supera la verificación, nginx muestra en su lugar «400 The SSL certificate error». La línea de registro se escribe con nivel info, así que no se ve con el nivel predeterminado de error_log.

nginx — ssl_verify_client on, request without a client certificate

Qué significa

nginx está configurado para TLS mutuo (ssl_verify_client on) y la solicitud llegó por una conexión TLS en la que el cliente no presentó ningún certificado. En lugar de hacer fallar el handshake, nginx lo completa y responde a cada solicitud con esta página HTTP 400, y registra «client sent no required SSL certificate» con nivel info. La solución está en el cliente: tiene que presentar un certificado emitido por la CA indicada en ssl_client_certificate.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Presentar el certificado de cliente

    Pasa el certificado y la clave al cliente; para navegadores y almacenes de claves de Windows/macOS, agrúpalos en un paquete PKCS#12 e importa ese archivo.

    bash
    curl --cert client.pem --key client.key https://mtls.example.com/
    # Browsers: import the client certificate with its key as PKCS#12
    openssl pkcs12 -export -in client.pem -inkey client.key -out client.p12
  2. 2.

    Proxy hacia un servicio mTLS: configurar el certificado para el upstream

    Cuando el propio nginx es el cliente del servicio mTLS, proxy_ssl_certificate y proxy_ssl_certificate_key aportan el certificado en la conexión con el upstream.

    text
    # nginx proxying to an mTLS upstream: present the client certificate on the upstream connection
    location / {
        proxy_pass https://mtls.example.com;
        proxy_ssl_certificate     /etc/nginx/tls/client.pem;
        proxy_ssl_certificate_key /etc/nginx/tls/client.key;
        proxy_ssl_server_name     on;
    }
  3. 3.

    Exigir certificados solo donde hagan falta

    ssl_verify_client optional, junto con una comprobación de $ssl_client_verify en cada location, mantiene accesibles sin certificado las rutas de comprobación de estado y las rutas públicas.

    text
    # Require the certificate only where needed
    ssl_verify_client optional;
    location /api/ {
        if ($ssl_client_verify != SUCCESS) { return 403; }
    }

Errores relacionados

Explorar toda la base de datos de errores de firma