Zum Inhalt springen
ecdsa.com
nginxWeitere Tools

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

So behebst du den Fehler

  1. 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. 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. 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; }
    }

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen