Fehlermeldung
SSL routines:tls_process_client_certificate:peer did not return a certificate
Auch ausgegeben als
- error:0A0000C7:SSL routines::peer did not return a certificate
OpenSSL 3.x protokolliert „error:0A0000C7:SSL routines:tls_process_client_certificate:peer did not return a certificate:<source>“. nginx nutzt diesen Weg nicht: Mit ssl_verify_client on schließt es den Handshake ab und gibt stattdessen HTTP 400 „No required SSL certificate was sent“ zurück.
OpenSSL (server side, mutual TLS) — SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE
Was der Fehler bedeutet
Das ist der serverseitige Eintrag eines fehlgeschlagenen Handshakes bei Mutual TLS: Der Server hat ein Client-Zertifikat verlangt (SSL_VERIFY_FAIL_IF_NO_PEER_CERT), und der Client hat keines gesendet. Der Server bricht dann mit einem Alert ab (certificate_required bei TLS 1.3, handshake_failure bei TLS 1.2), den der Client als Alert-Fehler sieht.
Warum der Fehler auftritt
Für den Client ist kein Zertifikat konfiguriert
häufigEin neues Deployment, ein rotiertes Secret, das den Client nicht erreicht hat, oder eine Bibliothek, der Zertifikat und Schlüssel nicht übergeben wurden.
Health Checks von Load Balancern und Monitoring
häufigHealth-Checker verbinden sich meist ohne Client-Zertifikat; auf einem Server, der für jede Verbindung eines verlangt, erzeugen sie einen stetigen Strom dieser Zeilen.
Der Client hat kein Zertifikat gefunden, das zur CA-Liste des Servers passt
gelegentlichBrowser und manche Bibliotheken bieten nur ein Zertifikat an, das von einer der CAs ausgestellt wurde, die der Server ankündigt; andernfalls senden sie eine leere Certificate-Nachricht.
So behebst du den Fehler
- 1.
Client-Zertifikat konfigurieren
Gib dem Client sein Zertifikat und seinen Schlüssel und teste mit curl --cert/--key.
bash # Test from the client side with a certificate curl --cert client.pem --key client.key https://mtls.example.com/ - 2.
Zertifikat dort optional machen, wo das nötig ist
Server, die auch Health Checks oder öffentliche Pfade bedienen, können Zertifikate optional anfordern und sie pro Location erzwingen.
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.
Angekündigte CA-Namen prüfen
Der Aussteller der Client-Zertifikate muss in der Liste stehen, die der Server sendet, sonst bieten Clients, die Zertifikate automatisch auswählen, keines an.
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'