Mensaje de error
SSL routines:tls_process_client_certificate:peer did not return a certificate
También se muestra como
- error:0A0000C7:SSL routines::peer did not return a certificate
OpenSSL 3.x registra «error:0A0000C7:SSL routines:tls_process_client_certificate:peer did not return a certificate:<source>». nginx no usa esta vía: con ssl_verify_client on, completa el handshake y, en su lugar, devuelve HTTP 400 «No required SSL certificate was sent».
OpenSSL (server side, mutual TLS) — SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE
Qué significa
Este es el registro del lado del servidor de un handshake de TLS mutuo fallido: el servidor exigía un certificado de cliente (SSL_VERIFY_FAIL_IF_NO_PEER_CERT) y el cliente no envió ninguno. Después, el servidor aborta con una alerta (certificate_required en TLS 1.3, handshake_failure en TLS 1.2), que el cliente ve como un error de alerta.
Por qué ocurre
El cliente no tiene ningún certificado configurado
frecuenteUn despliegue nuevo, un secreto rotado que no llegó al cliente o una biblioteca a la que no se le dio su certificado y su clave.
Comprobación de estado del balanceador de carga y monitorización
frecuenteLos comprobadores de estado suelen conectarse sin certificado de cliente; en un servidor que lo exige en cada conexión, generan un flujo constante de estas líneas.
El cliente no encontró ningún certificado que coincida con la lista de CA del servidor
ocasionalLos navegadores y algunas bibliotecas solo ofrecen un certificado emitido por una de las CA que anuncia el servidor; si no lo tienen, envían un mensaje de certificado vacío.
Cómo solucionarlo
- 1.
Configurar el certificado de cliente
Da al cliente su certificado y su clave, y prueba con curl --cert/--key.
bash # Test from the client side with a certificate curl --cert client.pem --key client.key https://mtls.example.com/ - 2.
Hacer opcional el certificado donde haga falta
Los servidores que también atienden solicitudes de comprobación de estado o rutas públicas pueden solicitar los certificados de forma opcional y exigirlos por ruta (location).
text # nginx: request but do not require a certificate on paths that must stay open (health checks) ssl_verify_client optional; location /internal/ { if ($ssl_client_verify != SUCCESS) { return 403; } } - 3.
Comprobar los nombres de CA anunciados
El emisor de los certificados de cliente debe estar en la lista que envía el servidor; de lo contrario, los clientes que eligen los certificados automáticamente no ofrecerán ninguno.
bash # The CA list the server advertises must include the issuer of the client certificates openssl s_client -connect mtls.example.com:443 -servername mtls.example.com </dev/null 2>/dev/null \ | sed -n '/Acceptable client certificate CA names/,/^Requested/p'