Nginx hört nicht auf HTTPS-Anfragen für Subdomains

Nginx hört nicht auf HTTPS-Anfragen für Subdomains

foo.comIch habe einen Nginx-Server, der sowohl die Hauptdomäne als auch eine Subdomäne für eine Website hostet bar.foo.com. Ich habe nur ein Zertifikat für meine Hauptdomäne, daher möchte ich nur HTTP-Anfragen für die Subdomäne. Ich habe beide Serverblöcke konfiguriert und alle Anfragen funktionieren gut: http://foo.comwerden umgeleitet zu https://foo.comund http://bar.foo.combleiben einfach bei HTTP.

Beim Versuch, eine Verbindung herzustellen https://bar.foo.com, tritt jedoch ein Problem auf. Obwohl ich den Subdomänen-Serverblock nicht so konfiguriert habe, dass er auf 443- oder SSL-Anfragen wartet, wird die Anfrage trotzdem bearbeitet und nachdem ich eine Warnung vom Browser erhalten habe, dass das Zertifikat einen anderen Hostnamen hat als den, den ich anfordere, ist die Seite, die ich erhalte, von der Hauptdomäne foo.com.

Offensichtlich hört der serverBlock, der nur auf HTTPS-Anfragen meiner Hauptdomäne hören sollte, irgendwie auch auf HTTPS-Anfragen der Subdomäne, und das möchte ich nicht.

Hier ist meine Konfiguration für die Hauptdomäne:

server {
  listen       80;
  server_name  foo.com www.foo.com;

  return 301 https://$server_name$request_uri;
}

server {
  listen       443 ssl;
  server_name  foo.com www.foo.com;

  ssl                  on;
  ssl_certificate      /etc/nginx/cert/foo.com.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.com.key;
  ...

  location / {
    root   /var/www/foo.com/public_html;
    index  index.html index.htm;
  }
}

Hier ist meine Konfiguration für die Subdomäne:

server {
  listen       80;
  server_name  bar.foo.com www.bar.foo.com;

  location / {
    root   /var/www/bar.foo.com/public_html;
    index  index.html index.htm;
  }
}

Und hier ist ein Ausschnitt der Nginx-Konfigurationsdatei:

server {
  listen       80 default_server;
  listen       [::]:80 default_server;
  server_name  _;
  root         /usr/share/nginx/html;

  location / {
}

Ich habe versucht, den Serverblock 443 meiner Hauptdomäne zu löschen, aber es hilft nicht foo.com.listen

Ich möchte, dass Nginx entweder nicht auf Anfragen wie diese hört https://bar.foo.comoder einfach 404 oder 444 zurückgibt.

Antwort1

Da Sie nur einen serverBlock für Port 443 konfiguriert haben, ist dies der von nginx verwendete virtuelle Standardserver, um alle Anfragen an Port 443 zu bearbeiten.

Um einen Standardserver für Port 443 (TLS) hinzuzufügen, können Sie den folgenden virtuellen Host hinzufügen:

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

Antwort2

Ich habe die Lösung gefunden. Genau wie @Tero und @Cosmic richtig bemerkt haben, serverwird mein einziger 443-Block für die Hauptdomäne auf den Standardblock serverfür alle 443-Anfragen gesetzt.

Ich habe den serverBlock in der Nginx-Konfigurationsdatei auskommentiert /etc/nginx/nginx.confund die folgenden zwei serverBlöcke hinzugefügt:

server {
  listen      80 default_server;
  server_name  _;
  return 444;
}

server {
  listen       443 ssl default_server;
  server_name  _;
  ssl_certificate      /etc/nginx/cert/foo.bar.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.bar.key;
  return 444;
}

Der erste wird auf die Standardsperre serverfür alle HTTP-Anfragen eingestellt und löscht alle nicht übereinstimmenden Anfragen. Der zweite löscht auf ähnliche Weise alle nicht übereinstimmenden 443- oder HTTPS-Anfragen.

Die von @Tero bereitgestellte Lösung funktioniert nicht, da Nginx für alle SSL- serverBlöcke ein Zertifikat erwartet. Sie müssen es daher mit einem Zertifikat versehen.

verwandte Informationen