Saltar al contenido
ecdsa.com
OpenSSL (client side)CLI de OpenSSL

Mensaje de error

SSL routines:ssl3_read_bytes:ssl/tls alert handshake failure

También se muestra como

  • SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
  • SSL alert number 40

OpenSSL 3.3 y las versiones posteriores imprimen «ssl/tls alert handshake failure», y las anteriores, «sslv3 alert handshake failure» (el mismo código 0A000410; 1.1.1 usaba 14094410). La línea termina con la ubicación en el código fuente y «SSL alert number 40».

OpenSSL (client side) — TLS alert 40 (handshake_failure) received from the server

Qué significa

El servidor envió la alerta TLS 40 (handshake_failure) y cerró la conexión. Es un rechazo genérico: el servidor no encontró en el ClientHello ningún conjunto de cifrado, grupo de intercambio de claves ni algoritmo de firma aceptable, exigía un certificado de cliente o rechazó el nombre de servidor solicitado. El cliente no puede conocer el motivo a partir de la alerta; está en el registro del servidor.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Leer el registro del servidor

    El servidor registra el motivo real, por ejemplo «no shared cipher» o «peer did not return a certificate».

    bash
    # The server knows why; with openssl s_server or nginx the log says e.g.
    #   ...:tls_post_process_client_hello:no shared cipher
    #   ...:tls_process_client_certificate:peer did not return a certificate
    sudo tail -n 50 /var/log/nginx/error.log | grep -i ssl
  2. 2.

    Acotar el problema desde el cliente

    Varía el SNI, la versión del protocolo, la lista de cifrados y la presencia de un certificado de cliente; la variante que funciona identifica la pieza que falta.

    bash
    h=api.example.com
    echo | openssl s_client -connect $h:443 -servername $h -brief                       # with SNI
    echo | openssl s_client -connect $h:443 -servername $h -tls1_2 -cipher 'ALL:@SECLEVEL=0' -brief
    echo | openssl s_client -connect $h:443 -servername $h -cert client.pem -key client.key -brief   # mTLS
  3. 3.

    Propietarios del servidor: ofrecer conjuntos actuales

    TLS 1.3 junto con TLS 1.2 con conjuntos ECDHE y AEAD funciona con todos los clientes que siguen teniendo mantenimiento.

    text
    # nginx: modern suites for TLS 1.2 plus TLS 1.3
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

Errores relacionados

Explorar toda la base de datos de errores de firma