Wie verwende ich ssl_verify_client = ON auf einem virtuellen Server und ssl_verify_client = OFF auf einem anderen?

8

Ich möchte die SSL-Client-Überprüfung für einen meiner virtuellen Hosts erzwingen. Erhalten Sie jedoch den Fehler "Kein erforderliches SSL-Zertifikat wurde gesendet" und versuchen Sie, etwas davon abzurufen.

Hier sind meine Testkonfigurationen:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

Der erste Server antwortet mit 200 http-Code, der zweite gibt "400 Bad Request, kein erforderliches SSL-Zertifikat wurde gesendet, nginx / 1.0.4" zurück.

Wahrscheinlich ist es unmöglich, ssl_verify_client auf derselben IP zu verwenden? Sollte ich diese Server an verschiedene IPs binden, wird dies mein Problem lösen?

Alexander Artemenko
quelle

Antworten:

3

Ich bin auf ein ähnliches Problem gestoßen, habe aber versucht, ssl_verify_clientszwischen Standortblöcken innerhalb eines Serverblocks und nicht zwischen Serverblöcken zu unterscheiden. Sie könnten Ihr Problem wahrscheinlich lösen, indem Sie das Standard-SSL-Konfigurationsmaterial auf die beiden Server verschieben (sicher duplizieren oder alle in einem Serverblock ablegen, die mehreren Unterdomänen akzeptieren und Speicherorte verwenden).

Für die standortbasierte Lösung sieht es wie folgt aus. Verwenden

ssl_verify_client optional;

im Serverblock und verwenden Sie if-Anweisungen an den verschiedenen Speicherorten, z.

if ($ssl_client_verify != SUCCESS) { return 403; }

Ich musste dies tun, um dem Administrator Zugriff auf eine Webanwendung zu gewähren, aber dennoch Webhooks von Github zuzulassen, ohne Github ein Client-SSL-Zertifikat zu erteilen.

Ethan
quelle
2

Sie müssen mindestens auf nginx> = 1.0.9 aktualisieren, wenn Sie mehrere namensbasierte virtuelle Hosts (mit SNI) auf derselben IP-Adresse und demselben Port haben möchten, jedoch mit unterschiedlichen ssl_verify_clientEinstellungen für diese Hosts.

In älteren Nginx-Versionen wurde die ssl_verify_clientEinstellung für den virtuellen Standardhost für alle anderen namensbasierten virtuellen Hosts auf derselben IP + -Port-Kombination verwendet. Einige andere SSL-Optionen ( ssl_verify_depth, ssl_prefer_server_ciphers) wurden ebenfalls auf die gleiche Weise behandelt. Die Verwendung einer separaten IP oder eines separaten Ports kann eine Problemumgehung sein, wenn Sie absolut kein Upgrade durchführen können.

Anmerkung aus dem Nginx- Änderungsprotokoll für 1.0.9:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Relevante Änderungen in der Nginx- Quelle: r4034 im Trunk, r4246 im 1.0-Zweig.

Sergey Vlasov
quelle
0

Haben Sie das von der Zertifizierungsstelle "/etc/certs/allcas.pem" signierte Client-Zertifikat (im PKCS12-Format) in Ihren Browser geladen? In Firefox können Sie Ihre Client-Zertifikate überprüfen, indem Sie auf Einstellungen -> Erweitert -> Verschlüsselung -> Zertifikate anzeigen -> Ihre Zertifikate klicken.

Der Wert des Parameters "ssl_verify_client" ist standardmäßig "off". Sie können den Wert "optional" auch verwenden, wenn das SSL-Client-Zertifikat nicht obligatorisch ist.

user1025596
quelle
Ich bin curl --cert verwendet ... mit den gleichen Ergebnissen.
Alexander Artemenko
Gibt es etwas Interessantes im Fehlerprotokoll von nginx? (wahrscheinlich /var/log/nginx/error.log)
user1025596
0

Ich bin kein Nginx-Experte, aber ich habe ähnliche Probleme mit Apache unter Verwendung von SSL und virtuellen Hosts gesehen. Das Problem ist die Reihenfolge, in der der Server die SSL-Aushandlung im Vergleich zur Auswahl des virtuellen Hosts abwickelt. Der erste Schritt besteht darin, die verschlüsselte Verbindung herzustellen. Erst danach sieht der Server, nach welchem ​​Hostnamen Sie fragen. Und bis es weiß, wird die Standardeinstellung verwendet - in diesem Fall der erste Host, für den ein Client-Zertifikat erforderlich ist, um die SSL-Verbindung herzustellen.

Kurze Antwort - in diesem Fall ist es besser, entweder separate Ports oder separate IP-Adressen zu haben.

Jenny D.
quelle
-1

Ich bin auf dasselbe Problem gestoßen und habe eine Lösung gefunden.

Bitte versuchen Sie, das default_serverFlag für den zweiten Server hinzuzufügen

listen 443 ssl default_server;
yfliu
quelle