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
El cliente no envió ningún certificado
frecuentecurl, scripts y clientes de API sin --cert/--key ni la opción equivalente de su biblioteca; contenedores o trabajos de CI a los que les falta el secreto con el certificado.
El navegador no tenía ningún certificado adecuado
frecuenteLos navegadores solo ofrecen certificados emitidos por una CA que nginx anuncia (tomada de ssl_client_certificate); con un certificado de otra CA, o sin ninguno importado, el navegador no envía nada.
Un proxy termina TLS antes de nginx
ocasionalUna CDN, un balanceador de carga u otro nginx situado delante abre su propia conexión TLS sin certificado de cliente; en ese caso, el TLS mutuo hay que configurarlo en ese salto (o resolverlo en el perímetro).
Cómo solucionarlo
- 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.
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.
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; } }