Certificado SSL Nginx servido para todo o nome do servidor resolvendo o IP do servidor

3

Tendo em conta que eu tenho 2 subdomínios configurados no DNS (assim ping ambos respondem para ambos com o endereço IP do meu servidor) e para esses subdomínios eu tenho 2 certificados TLS diferentes.

Eu configurei o nginx desta maneira:

# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the
# scheme used to connect to this server
map $http_x_forwarded_proto $proxy_x_forwarded_proto {
  default $http_x_forwarded_proto;
  ''      $scheme;
}

# If we receive Upgrade, set Connection to "upgrade"; otherwise, delete any
# Connection header that may have been passed to this server
map $http_upgrade $proxy_connection {
  default upgrade;
  ''      '';
}

gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

access_log /var/log/nginx.log;
error_log /var/log/nginx_errors.log;

# HTTP 1.1 support
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;

server {
  listen 80 default_server;
  server_name _; # This is just an invalid value which will never trigger on a real hostname.
  return 503;
  server_tokens off; # Hide the nginx version
}


upstream sub1.domain.tld {
  server 172.17.0.27:5000;
}

server {
  server_name sub1.domain.tld;
  server_tokens off; # Hide the nginx version

  listen 443 ssl;
  ssl_certificate /etc/nginx/ssl/sub1.domain.tld.crt;
  ssl_certificate_key /etc/nginx/ssl/sub1.domain.tld.key;

  location / {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/htpasswd/sub1.htpasswd;
    proxy_pass http://sub1.domain.tld;
  }
}

Neste ponto, se eu for para https://sub1.domain.tld , tudo está funcionando bem. Agora, se eu tentar acessar o https://sub2.domain.tld , que ainda não está configurado e, portanto, não deve responder, aceite a conexão e me mostre um problema com o certificado, pois ele não corresponde ao nome do servidor, portanto, com essa configuração, o Nginx envie o certificado para todos os pedidos para a porta 443.

Como devo alterar minha configuração para que o acesso a https://sub2.domain.tld falhe (com um erro 503, por exemplo) até que eu o configure adicionando uma nova instrução server ?

    
por ZedTuX 30.12.2014 / 21:13

2 respostas

1

Você pode adicionar outro bloco de servidor assim:

server {
    listen 443 ssl default_server;
    server_name _;

    ssl_certificate /etc/nginx/ssl/default.crt;
    ssl_certificate_key /etc/nginx/ssl/default.key;

    return 503;
}

Para o certificado padrão, você pode criar um certificado autoassinado. Isso acionará um erro de certificado inválido no cliente, como Steffen mencionou. Se o usuário aceitar o certificado, ele receberá o código de status 503.

    
por 31.12.2014 / 00:17
2

Se você escutar na porta TCP 443 em um IP específico, ele aceitará novas conexões TCP nesta porta, mesmo se você tiver apenas o SSL configurado para alguns dos domínios que resolvem este endereço IP. E assim que a conexão TCP for estabelecida, ela fará o handshake SSL e escolherá o certificado mais adequado, que é o certificado correspondente, se for usado SNI (ou seja, envia o nome de host esperado no handshake SSL) ou apenas outro certificado, se não puder determinar o nome do host solicitado ou se nenhum certificado estiver configurado para este nome.

Isso significa que você precisa ter certificados para todos os domínios acessíveis neste endereço IP ou aceitar, que o acesso a domínios sem os certificados apropriados causará erros como certificados inválidos. Isso não é específico para o nginx, mas é porque o SSL é uma camada sobre o TCP e as informações sobre o host solicitado são transmitidas somente dentro da conexão TCP estabelecida.

    
por 30.12.2014 / 23:23

Tags