Nginx não escuta solicitações HTTPS para subdomínios

Nginx não escuta solicitações HTTPS para subdomínios

Eu tenho um servidor Nginx que hospeda o domínio principal foo.come um subdomínio bar.foo.comde um site. Eu só tenho um certificado para meu domínio principal, então só quero solicitações HTTP para o subdomínio. Configurei os dois blocos de servidor e todas as solicitações funcionam bem: http://foo.comserão redirecionadas para https://foo.come http://bar.foo.compermanecerão apenas em HTTP.

No entanto, surgiu um problema quando tentei me conectar https://bar.foo.com, embora eu não tenha configurado o bloco do servidor de subdomínio para escutar solicitações 443 ou SSL, a solicitação ainda é tratada e após receber um aviso do navegador de que o certificado tem um nome de host diferente diferente daquela que estou solicitando, a página que recebo é do domínio principal foo.com.

Então, aparentemente, o serverbloco que deveria ouvir apenas as solicitações HTTPS do meu domínio principal, de alguma forma também está ouvindo as solicitações HTTPS do subdomínio, não quero que isso aconteça.

Aqui está minha configuração para o domínio 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;
  }
}

Aqui está minha configuração para o subdomínio:

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

E aqui está um trecho do arquivo de configuração do Nginx:

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

  location / {
}

Tentei excluir foo.como listenbloco de servidores 443 do meu domínio principal, mas não ajudou.

Gostaria que o Nginx não ouvisse solicitações como https://bar.foo.comou simplesmente retornasse 404 ou 444.

Responder1

Como você tem apenas um serverbloco configurado para a porta 443, ele é o servidor virtual padrão usado pelo nginx para atender todas as solicitações à porta 443.

Para adicionar um servidor padrão para a porta 443 (TLS), você pode adicionar o seguinte host virtual:

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

Responder2

Eu descobri a solução. Assim como @Tero e @Cosmic apontaram corretamente, meu único serverbloco 443 para o domínio principal está sendo definido como o serverbloco padrão para todas as 443 solicitações.

Comentei o serverbloco no arquivo de configuração do Nginx /etc/nginx/nginx.confe adicionei os dois serverblocos a seguir:

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

O primeiro será definido como o serverbloco padrão para quaisquer solicitações HTTP, eliminando quaisquer solicitações sem correspondência, e da mesma forma, o segundo descartará quaisquer solicitações 443 ou HTTPS sem correspondência.

A solução fornecida pelo @Tero não funcionará, porque o Nginx espera um certificado para qualquer serverbloco SSL, portanto, você precisará fornecer um certificado.

informação relacionada