NGinx SSL-Zertifikat-Authentifizierung, signiert von Zwischen-CA (Kette)
Ich versuche, aktivieren Sie die client-Zertifikat-Authentifizierung in nginx, wo die Zertifikate signiert wurden, die von einer Zwischenzertifizierungsstelle. Ich bin in der Lage, dies funktioniert gut, wenn mit einem Zertifikat durch ein selbstsigniertes root-CA; dies gilt jedoch nicht, wenn das signierende CA intermediate CA.
Meine einfache server-Abschnitt sieht wie folgt aus:
server {
listen 443;
server_name _;
ssl on;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_client_certificate ca.pem;
ssl_verify_client on;
ssl_verify_depth 1;
location /{
root html;
index index.html index.htm;
}
}
Für den Inhalt der ca.pem, ich habe versucht mit nur das intermediate-CA und auch die Verkettung der intermediate-CA-Zertifikat und das root-CA-cert, d.h. so etwas wie:
cp intermediate.crt ca.pem
cat root.crt >> ca.pem
Habe ich auch überprüft, ob das Zertifikat gültig von openssl ist die Perspektive, wenn mit dem gleichen CA-Kette:
openssl verify -CAfile /etc/nginx/ca.pem certs/client.crt
certs/client.crt: OK
Habe ich experimentierte mit der Einstellung ssl_verify_depth explizit auf 1 (wie oben) und dann ist auch 0 (nicht sicher, was diese Zahl genau bedeutet), aber bekomme immer noch denselben Fehler.
Den Fehler bekomme ich in allen Varianten von intermed CA "400 Bad Request" und insbesondere "Das SSL-Zertifikat-Fehler" (nicht sicher, was das genau bedeutet).
Vielleicht nginx nur nicht unterstützt cert-Ketten für die zwischen-certs? Jede Hilfe sehr dankbar!
InformationsquelleAutor der Frage Hans L | 2011-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Edit: ich hatte auch dieses "problem", Lösung und Erklärung unten im text.
Schien es wie nginx nicht unterstützt intermediate-Zertifikate. Meine Zertifikate selbst erstellt: (RootCA ist eigensignierter, IntrermediateCA1 ist signiert von RootCA, etc.)
Möchte ich in nginx "IntermediateCA1", um Zugang zu site nur für Besitzer der "Client1" - Zertifikat.
Wenn ich auf "ssl_client_certificate" Datei mit IntermediateCA1 und RootCAund setzen Sie "ssl_verify_depth 2" (oder mehr) clients können sich anmelden, Website mit Zertifikat Client1 und Client2 (sollte nur Client1).
Das gleiche Ergebnis ist, wenn ich auf "ssl_client_certificate" Datei mit nur RootCA - clients einloggen können.
Wenn ich auf "ssl_client_certificate" Datei mit nur IntermediateCA1und setzen Sie "ssl_verify_depth 1" (oder "2" oder mehr - egal) , es ist imposible, um sich anzumelden, bekomme ich den Fehler 400. Und im debug-Modus sehe ich Protokolle:
Ich glaube, das ist ein bug. Getestet auf Ubuntu, nginx 1.1.19 und 1.2.7-1~dotdeb.1, openssl 1.0.1.
Ich sehe, dass nginx 1.3 hat einige Optionen mehr über die Verwendung von client-Zertifikaten, aber ich'dont siehe Lösung zu diesem problem.
Derzeit nur eine Möglichkeit zum trennen von clients 1 und 2 ist zwei, eigensignierter RootCAs, dies ist aber nur ein workaround..
Edit 1:
Gemeldet ich hab dieses Problem hier: http://trac.nginx.org/nginx/ticket/301
Edit 2"
*Ok, es ist kein bug, es ist feature 😉*
Bekomme ich Antwort hier: http://trac.nginx.org/nginx/ticket/301
Es funktioniertmüssen Sie nur überprüfen, was Ihre ssl_client_i_dn ist (. Anstelle der Emittenten, die Sie verwenden können, die ebenfalls Gegenstand der Bescheinigung ist, oder was Sie wollen von http://wiki.nginx.org/HttpSslModule#Built-in_variables
[ Edit von mir, es funktioniert in meiner Konfiguration ]
InformationsquelleAutor der Antwort Jack
Haben Sie versucht, die Erhöhung
ssl_verify_depth
Richtlinie? Docs sagen:Aber Ihr überprüfen, Tiefe 1 ist. Sie sagen:
Also, versuchen Sie, 2 oder 3..
PS:
Überall, wo ich finden, die dieses problem erwähnt, seine erzählte kombinieren intermediate-CA-Zertifikate mit der Sie server-cert. in einer Datei (als @vikas-nalwar vorgeschlagen und Sie haben) in der Reihenfolge der überprüfung (aber ich bin mir nicht sicher, ob die Reihenfolge spielt eine Rolle) und-grob gesprochen-set
ssl_verify_depth
Anzahl von certs im bundle.InformationsquelleAutor der Antwort Andrew D.
Ich glaube, dass Sie möchten, aktivieren Sie die client-Validierung auf Ihrem server-Seite. Wenn dies so ist, ich sehe nicht, dass Sie Ihr client-Zertifikat in der Kette. Versuchen Sie, die folgenden in der gleichen Reihenfolge. Verwenden Sie die certchain.pem.
InformationsquelleAutor der Antwort Drona
als ich war strugling mit nginx und cloudflare,
diese Zeilen hat den trick für mich:
in der zweiten Zeile mit optional_no_ca ist der wichtige Teil
InformationsquelleAutor der Antwort Tal
Ich muss sagen, es funktioniert gut für mich mit
nginx/1.13.2
d.h.Ich concat die certs wie
cat client-intermediate1.crt ca-client.crt > ca.chained1.crt
undcat client-intermediate2.crt ca-client.crt > ca.chained2.crt
undcat ca.chained1.crt ca.chained2.crt > ca.multiple.intermediate.crt
wenn ich nur ca.chained1.crt als
ssl_client_certificate
dann nur client1.crt anschließen kann, ebenfalls für ca.chained2.crt/client2.crtca.multiple.intermediate.crt
dann beide clients verbinden können,für den Widerruf ein Zwischenprodukt, entfernen Sie einfach die cert-Kette von ca.mehrere.Mittelstufe.crt
hier ist der entsprechende config. auch hat eine hohe Sicherheitseinstellungen
wenn Sie möchten, analysieren die certs CN und übergeben backend, dann fügen Sie diese AUßERHALB der
server {..
blockund in den block, können Sie es verwenden, dann
InformationsquelleAutor der Antwort pHiL
weitere einfache Möglichkeit ist die Verkettung von Zertifikaten (inklusive domain certifate) in einer einzigen Datei und verwenden, die auf Ihrem Server und nginx conf-Datei
Immer daran denken, Sie mit dem server-Zertifikat den ersten und dann nur CA-server-Zertifikate
Können Sie mehr Lesen über am http://nginx.org/en/docs/http/configuring_https_servers.html#chains
InformationsquelleAutor der Antwort Naveen