Frage Nginx. Wie lehne ich die Anfrage an den nicht aufgelisteten SSL-Server ab?


Ich habe ein Wildcard-SSL-Zertifikat und mehrere Subdomains auf der gleichen IP-Adresse. Jetzt möchte ich, dass mein Nginx nur erwähnte Servernamen behandelt und die Verbindung für andere löscht, damit es so aussieht nginx läuft nicht nach nicht aufgelisteten Servernamen (nicht antwortet, zurückweist, tot, kein einziges Byte als Antwort). Ich mache folgendes

ssl_certificate         tls/domain.crt;
ssl_certificate_key     tls/domain.key;

server {
  listen 1.2.3.4:443 ssl;
  server_name validname.domain.com;
  //
}

server {
  listen 1.2.3.4:443 ssl;
  server_name _;
  // deny all;
  // return 444;
  // return 404;
  //location {
  //  deny all;
  //}
}

Ich habe fast alles im letzten Serverblock ausprobiert, aber keinen Erfolg. Ich erhalte entweder eine gültige Antwort von einem bekannten virtuellen Server oder einen Fehlercode. Bitte helfen Sie.


11
2018-03-27 13:26


Ursprung




Antworten:


Es funktioniert nicht so: Der SSL-Handshake findet vor HTTP statt, daher wird der Name auf dem Zertifikat im Browser ausgewertet, bevor Sie umleiten oder irgendetwas anderes innerhalb der nginx-Konfiguration tun können.


6
2018-03-27 13:30



das ist schlecht, aber muss zugeben) Danke. - Osw
Das ist nicht wahr: Sie können etwas anderes auf niedrigerer Ebene tun, wie zum Beispiel das Löschen der Verbindung ohne Antwort, wie in anderen Antworten erklärt. - collimarco


Die Antwort von cjc hat bereits korrekt auf das Problem mit dem Versuch hingewiesen, Hostnamen zu vergleichen, wenn SSL aktiviert ist. Es ist jedoch möglich, es so zu machen:

server {
    ...

    if ($host !~* ^validname\.domain\.com$ ) {
        return 444;
    }
    ...
}

Hinweis: Ja, das stimmt generell if ist böseaber es ist sicher zu benutzen if in diesem Fall. (Lesen Sie die verlinkte Seite, wenn Sie sich selbst davon überzeugen müssen.)

Im Gegensatz zu dem, was vorgeschlagen wurde, wird das Hinzufügen des folgenden Blocks nicht funktionieren:

server {
    listen 80;
    listen 443 ssl;
    return 444;
}

weil ein passendes SSL-Zertifikat validname.domain.com stimmt nicht mit irgendeinem zufälligen Domainnamen überein. Ich habe es versucht, und nginx hat sich verhalten, als wäre der Block gar nicht vorhanden.

Dies wird auch nicht funktionieren:

server {
    listen       443;
    server_name    _;
    return 444; 
}

weil es machen wird jeder einzelne Die HTTPS-Verbindung an Port 443 schlägt fehl, auch die, die durchgehen sollten. Ich habe das auch versucht. wget einen SSL-Handshake-Fehler gemeldet.


12
2018-05-07 13:53





Ich habe heute die obige Lösung implementiert und es funktionierte gut. Alle nicht angegebenen URLs werden jetzt gelöscht. Das Platzieren dieses Server-Codes vor dem eigentlichen Eintrag des virtuellen Servers war der Schlüssel - alle falsch geformten URLs gehen jetzt auf diesen "Standard" -Server.

... 
server {
     listen       443;
     server_name    _;
     return 444; }

server {
     listen       443;
     server_name  [URL]

1
2017-12-06 22:30





Die meisten Antworten hier sind ungefähr Warum es funktioniert nicht, nicht Wie damit es funktioniert.

Hier ist wie - Sie müssen einen solchen catch-all Server zu einem 'default_server' machen und müssen Pfade zu cert / key bereitstellen, damit er eingehende SSL-Anfragen entschlüsseln und den Host-Header abgleichen kann:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404;
}

Notieren Sie dort das ssl_certificate / ssl_certificate_key. Wenn sie nicht angegeben sind, versucht nginx immer noch, solchen default_server zu verwenden, und schlägt fehl, da es keine SSL-Verbindung ohne Zertifikat / Schlüssel akzeptieren kann. Man kann irgendein Zertifikat / Schlüssel, z.B. selbstsigniert. ...

So generieren Sie ein selbstsigniertes Zertifikat:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 

Siehe auch https://serverfault.com/a/841643/87439


1
2018-03-30 20:50



Hast du das versucht? Wie erstellen Sie ein SSL-Zertifikat, das dem Servernamen "_" entspricht? - Tim
Ja, diese Lösung funktioniert für mich. Ich hatte dasselbe genaue Problem und stellte aus der Dokumentation fest, dass nginx ein cert / key benötigt, da es nicht auf TLS SNI schaut. Sie können jedes Zertifikat / jeden Schlüssel verwenden, z. selbstsigniert. - AndreyT


Sie sollten damit umgehen können, indem Sie den Server, der die nicht aufgeführten Elemente behandelt, zum ersten Serverblock in Ihrer Konfiguration machen.

http {
    ...

    server {
        listen 80;
        listen 443 ssl;
        return 444;
    }

    server {
        server_name validname.domain.com;
        ...
    }
}

Alle nicht speziell identifizierten Domains werden von diesem Serverblock behandelt.


0
2018-03-27 20:07



Es funktioniert nicht - TechJS