Fehlermeldung
SSL routines:tls_post_process_client_hello:no shared cipher
Auch ausgegeben als
- SSL_do_handshake() failed (SSL: error:0A0000C1:SSL routines::no shared cipher)
- error:0A0000C1:SSL routines::no shared cipher
openssl s_server (OpenSSL 3.x) protokolliert „error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:<source>“; nginx protokolliert „SSL_do_handshake() failed (SSL: error:0A0000C1:SSL routines::no shared cipher) while SSL handshaking“ auf der Stufe info, deshalb ist die Meldung mit der Standardstufe von error_log unsichtbar. OpenSSL 1.1.1 verwendete den Code 1417A0C1.
OpenSSL (server side: nginx, Apache, Postfix, openssl s_server) — SSL_R_NO_SHARED_CIPHER
Was der Fehler bedeutet
Das ist die Sicht des Servers auf einen fehlgeschlagenen Handshake: Keine der Cipher Suites im ClientHello des Clients ist auf dem Server aktiviert und zugleich mit dem Schlüssel des Serverzertifikats nutzbar. Der Server sendet dem Client daraufhin handshake_failure (Alert 40). Die Meldung erscheint in Server-Logs, nicht in der Ausgabe des Clients.
Warum der Fehler auftritt
Die Cipher-Liste passt nicht zum Schlüsseltyp des Zertifikats
häufigEin ECDSA-Zertifikat, bei dem nur Suites vom Typ ECDHE-RSA-* aktiviert sind (oder ein RSA-Zertifikat mit nur ECDHE-ECDSA-*), lässt keine nutzbare Suite für TLS 1.2 übrig; deshalb scheitert jeder Client mit TLS 1.2.
Eine von Hand gekürzte Cipher-Liste schließt echte Clients aus
häufigListen, die auf ein oder zwei Suites oder nur auf CHACHA20 reduziert sind, sperren Clients (und Monitoring-Tools) aus, die andere moderne Suites bevorzugen.
Sehr alte Clients
gelegentlichClients, die auf Suites mit RSA-Schlüsselaustausch, CBC oder 3DES beschränkt sind (altes Java, eingebettete Geräte), können sich nicht mit einer modernen Konfiguration verbinden; entscheide bewusst, ob du sie unterstützen willst.
So behebst du den Fehler
- 1.
Zertifikatsschlüssel mit den Suites abgleichen
Suites vom Typ ECDHE-ECDSA-* brauchen ein ECDSA-Zertifikat, ECDHE-RSA-* ein RSA-Zertifikat; Server mit beiden Zertifikaten können beide Familien aufführen.
bash # ECDSA key + only ECDHE-RSA suites (or the reverse) leaves nothing usable openssl x509 -in server.pem -noout -text | grep 'Public Key Algorithm' openssl ciphers -v 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256' - 2.
Tatsächlich akzeptierte Suites des Servers auflisten
Ermittle sie von außen und vergleiche sie mit den Clients, die du unterstützen musst.
bash # Which TLS 1.2 suites does the server accept? (nmap needed) nmap --script ssl-enum-ciphers -p 443 api.example.com - 3.
Gut getestete Suite-Liste verwenden
Starte mit einer generierten Konfiguration (Modern oder Intermediate), statt Listen von Hand zu kürzen.
text # nginx: suites for both RSA and ECDSA certificates, TLS 1.3 enabled 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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;