Zum Inhalt springen
ecdsa.com
OpenSSL (client side)OpenSSL-CLI

Fehlermeldung

SSL routines:ssl3_read_bytes:ssl/tls alert handshake failure

Auch ausgegeben als

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

Ab OpenSSL 3.3 lautet die Ausgabe „ssl/tls alert handshake failure“, in früheren Versionen „sslv3 alert handshake failure“ (derselbe Code 0A000410; 1.1.1 verwendete 14094410). Die Zeile endet mit der Stelle im Quellcode und „SSL alert number 40“.

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

Was der Fehler bedeutet

Der Server hat den TLS-Alert 40 (handshake_failure) gesendet und die Verbindung geschlossen. Das ist eine allgemeine Ablehnung: Der Server hat im ClientHello keine akzeptable Cipher Suite, keine akzeptable Schlüsselaustauschgruppe oder keinen akzeptablen Signaturalgorithmus gefunden, ein Client-Zertifikat verlangt oder den angeforderten Servernamen abgelehnt. Der Client kann den Grund nicht aus dem Alert erfahren; er steht im Log des Servers.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Log des Servers lesen

    Der Server protokolliert den tatsächlichen Grund, zum Beispiel „no shared cipher“ oder „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.

    Vom Client aus eingrenzen

    Variiere SNI, die Protokollversion, die Cipher-Liste und ob ein Client-Zertifikat vorhanden ist; die Variante, die funktioniert, zeigt, was fehlt.

    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.

    Eigener Server: aktuelle Suites anbieten

    Eine Konfiguration mit TLS 1.3 und zusätzlich TLS 1.2 mit ECDHE- und AEAD-Suites funktioniert mit jedem Client, der noch gepflegt wird.

    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;

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen