Nginx no escucha las solicitudes HTTPS para subdominios

Nginx no escucha las solicitudes HTTPS para subdominios

Tengo un servidor Nginx que aloja tanto el dominio principal foo.comcomo un subdominio bar.foo.comde un sitio web. Solo tengo un certificado para mi dominio principal, por lo que solo quiero solicitudes HTTP para el subdominio. He configurado ambos bloques de servidor y todas las solicitudes funcionan bien: http://foo.comserán redirigidas a https://foo.comy http://bar.foo.compermanecen en HTTP.

Sin embargo, surge un problema cuando intenté conectarme https://bar.foo.com, aunque no configuré el bloque del servidor del subdominio para escuchar solicitudes 443 o ssl, la solicitud aún se maneja y después de recibir una advertencia del navegador de que el certificado tiene un nombre de host diferente que la que estoy solicitando, la página que me sale es del dominio principal foo.com.

Entonces, aparentemente, el serverbloque que se suponía que solo escucharía las solicitudes HTTPS de mi dominio principal, de alguna manera también está escuchando las solicitudes HTTPS del subdominio, no quiero que esto suceda.

Aquí está mi configuración para el dominio principal:

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;
  }
}

Aquí está mi configuración para el subdominio:

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;
  }
}

Y aquí hay un fragmento del archivo de configuración de Nginx:

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

  location / {
}

Intenté eliminar foo.comdespués listenen el bloque del servidor 443 de mi dominio principal, pero no ayuda.

Me gustaría que Nginx no escuche solicitudes como https://bar.foo.como simplemente devuelva 404 o 444.

Respuesta1

Dado que solo tiene un serverbloque configurado para el puerto 443, es el servidor virtual predeterminado utilizado por nginx para atender todas las solicitudes al puerto 443.

Para agregar un servidor predeterminado para el puerto 443 (TLS), puede agregar el siguiente host virtual:

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

Respuesta2

He descubierto la solución. Tal como @Tero y @Cosmic señalaron correctamente, mi único serverbloque 443 para el dominio principal se establece en el serverbloque predeterminado para todas las solicitudes 443.

Comenté el serverbloque en el archivo de configuración de Nginx /etc/nginx/nginx.confy agregué los dos serverbloques siguientes:

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;
}

El primero se establecerá en el serverbloque predeterminado para cualquier solicitud HTTP, descartando cualquier solicitud no coincidente, y de manera similar, el segundo descartará cualquier solicitud 443 o HTTPS no coincidente.

La solución que proporcionó @Tero no funcionará porque Nginx espera un certificado para cualquier serverbloque SSL, por lo que deberá proporcionarle un certificado.

información relacionada