Lassen Sie Nginx unbekannte Servernamen über HTTPS ablehnen


7

Ich habe eine Nginx-Instanz, die SNI verwendet, um mehrere HTTPS-Domänen von einer einzigen IP aus zu bedienen.

Der einzige Fehler beim Setup besteht darin, dass Nginx mit der ersten (standardmäßig) Domäne antwortet, wenn eine URL für die nackte IP des Servers oder eine Domäne an dieser IP angefordert wird, für die es keinen entsprechenden HTTPS-Serverblock gibt. In diesem Fall würde ich es vorziehen, einfach einen Standard 403 Forbidden zurückzugeben. Ich würde einen Standardserverblock einrichten, um dies zu tun, aber ich kann keinen Weg finden, um Warnungen bezüglich der Nichtübereinstimmung von Clientzertifikaten zu umgehen.

(Wie c | C) und ich konfiguriere Nginx so, dass Anforderungen an solche unbekannten / undefinierten Domänen abgelehnt werden, ohne dass ein bestimmtes SSL-Zertifikat angegeben werden muss, das die Browser verärgert? (dh ich brauche Nginx, um die Anfrage mit einem 403 abzulehnen, bevor der Client mit einem "schlechten" Zertifikat gestört wird - vom POV des Clients sollte dies identisch sein mit dem Fall, in dem überhaupt kein HTTPS-Serverblock definiert ist.)

Antworten:


7

Diese Frage ähnelt der, die ich gestern beantwortet habe: nginx und SNI: Ist es möglich, das SSL-Zertifikat automatisch nach Domainnamen aufzulösen?

Es ist nicht möglich, die Verbindung abzulehnen, bevor der Benutzer eine fehlerhafte Zertifikatmeldung in seinem Browser sieht. Bis Nginx möglicherweise eine HTTP 403-Antwort zurückgibt, ist der SSL-Handshake beendet. Um den Handshake abzuschließen, muss der Browser das bereitgestellte Zertifikat akzeptieren. Sie können die Verbindung erst ablehnen, nachdem der Benutzer das Zertifikat akzeptiert hat, indem Sie einen Standardserver einrichten:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Die neuesten Browser unterstützen jedoch die Angabe des Servernamens. Wenn für jeden vhost ein Zertifikat festgelegt ist, ist es für einen normalen Benutzer ziemlich unwahrscheinlich, dass diese Meldung angezeigt wird.

Es könnte möglich sein, Verbindungen ohne gültigen Hostnamen, der von SSL mit iptables angegeben wird, abzulehnen, aber das ist wahrscheinlich ziemlich schwierig und würde überhaupt keinen Standards entsprechen.

Aktualisierte Informationen: Es ist möglich, return 444die TCP-Verbindung sofort abzubrechen, bevor ein Zertifikatfehler angezeigt wird.


Mit SNI können Sie die Verbindung theoretisch abbrechen, wenn für den angegebenen Domänennamen kein Zertifikat vorhanden ist. Dies wäre immer noch besser als die Anzeige eines Zertifizierungsfehlers. Wissen Sie, wie das geht?
Yogu

Ja, ich habe herausgefunden, dass es möglich ist, return 444die TCP-Verbindung abzubrechen, bevor ein Zertifizierungsfehler angezeigt wird.
Xblax

@xblax Können Sie uns auch mitteilen, wie 444 zurückgegeben werden soll, bevor ein Zertifikat angezeigt wird? Im Idealfall würde ich keine Ressourcen für einen Handshake für eine Anfrage an einen Servernamen verschwenden, den ich nicht kenne. SNI sollte den angeforderten Namen offenlegen, bevor die Anforderung überhaupt entschlüsselt wird.
Statischer Sturm

0

Wenn Ihre Domains Subdomains desselben Masters sind (* .example.com), können Sie ein Platzhalterzertifikat verwenden. Andernfalls können Sie meines Erachtens kein Zertifikat bereitstellen, mit dem der Browser zufrieden sein wird.


Hallo Chris. Ich schätze den Wildcard-Punkt, aber es ist nicht wirklich das, was ich frage. Ja, der Browser wird kein Zertifikat mögen, ABER gibt es eine Möglichkeit, die Verbindung basierend auf dem angeforderten Servernamen abzulehnen? (Ich vermute nicht, aber dies scheint der Ort zu sein, um zu fragen ... :)
Carlton Gibson

Ungetestete Annahme -> Sie müssen ein gültiges Zertifikat angeben, sonst betrachtet der Browser die Verbindung als unsicher. Der Browser reagiert daher nicht auf eine Weiterleitung, die Sie senden, bis der Benutzer eine Überschreibung zulässt. Die einzige Möglichkeit, die Überschreibung automatisch durchzuführen, besteht darin, ein gültiges Zertifikat bereitzustellen. :-(
Chris Nava
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.