Fehlermeldung
400 No required SSL certificate was sent
Auch ausgegeben als
- client sent no required SSL certificate while reading client request headers
Der Seitentitel lautet „400 No required SSL certificate was sent“; bei einem Zertifikat, das die Prüfung nicht besteht, zeigt nginx stattdessen „400 The SSL certificate error“. Die Logzeile wird auf Level info geschrieben und ist deshalb mit dem Standard-Level von error_log unsichtbar.
nginx — ssl_verify_client on, request without a client certificate
Was der Fehler bedeutet
nginx ist für Mutual TLS konfiguriert (ssl_verify_client on), und die Anfrage kam über eine TLS-Verbindung, auf der der Client kein Zertifikat vorgelegt hat. Statt den Handshake abzubrechen, schließt nginx ihn ab, beantwortet jede Anfrage mit dieser HTTP-400-Seite und protokolliert „client sent no required SSL certificate“ auf Level info. Die Lösung liegt beim Client: Er muss ein Zertifikat vorlegen, das von der CA in ssl_client_certificate ausgestellt wurde.
Warum der Fehler auftritt
Der Client hat kein Zertifikat gesendet
häufigcurl, Skripte und API-Clients ohne --cert/--key oder die entsprechende Option der Bibliothek; Container oder CI-Jobs, denen das Secret mit dem Zertifikat fehlt.
Der Browser hatte kein passendes Zertifikat
häufigBrowser bieten nur Zertifikate an, die von einer CA ausgestellt wurden, die nginx ankündigt (aus ssl_client_certificate); stammt das Zertifikat von einer anderen CA oder ist gar keines importiert, sendet der Browser nichts.
Ein Proxy terminiert TLS vor nginx
gelegentlichEin CDN, ein Load Balancer oder ein weiterer nginx davor öffnet eine eigene TLS-Verbindung ohne Client-Zertifikat; Mutual TLS muss dann auf dieser Teilstrecke konfiguriert (oder schon am Edge erledigt) werden.
So behebst du den Fehler
- 1.
Client-Zertifikat vorlegen
Übergib dem Client Zertifikat und Schlüssel; für Browser und die Schlüsselspeicher von Windows/macOS verpacke beides in ein PKCS#12-Paket und importiere die Datei.
bash curl --cert client.pem --key client.key https://mtls.example.com/ # Browsers: import the client certificate with its key as PKCS#12 openssl pkcs12 -export -in client.pem -inkey client.key -out client.p12 - 2.
Proxy zu einem mTLS-Dienst: Upstream-Zertifikat konfigurieren
Ist nginx selbst der Client des mTLS-Diensts, liefern proxy_ssl_certificate und proxy_ssl_certificate_key das Zertifikat für die Upstream-Verbindung.
text # nginx proxying to an mTLS upstream: present the client certificate on the upstream connection location / { proxy_pass https://mtls.example.com; proxy_ssl_certificate /etc/nginx/tls/client.pem; proxy_ssl_certificate_key /etc/nginx/tls/client.key; proxy_ssl_server_name on; } - 3.
Zertifikate nur dort verlangen, wo sie nötig sind
ssl_verify_client optional zusammen mit einer Prüfung von $ssl_client_verify je location hält Health Checks und öffentliche Pfade ohne Zertifikat erreichbar.
text # Require the certificate only where needed ssl_verify_client optional; location /api/ { if ($ssl_client_verify != SUCCESS) { return 403; } }