Nginx um ip e vários certificados ssl

4

Exemplo de caso. Eu tenho um servidor web com um endereço IPV4. Estou hospedando ~ 50 sites e apenas dois deles têm certificados SSL. Eu configurei vhosts para 2 sites ssl e tudo está OK, exceto um grande problema - se eu visitar outros 48 sites usando https: // prefixo (eles não têm certificados ssl), estou vendo meu último site com um certificado SSL .

É possível evitar o prefixo https em sites não SSL? Ou há apenas uma solução - para usar endereços IP dedicados. Se eu tenho endereço IP dedicado estou usando a seguinte configuração:

server {
        listen 111.222.333.444:443 ssl;
}

Dessa forma, se eu forçar o https em um site não SSL, nada acontece.

    
por Alexander Kim 29.03.2016 / 19:47

2 respostas

6

O Nginx usa um "servidor padrão" escolhido para veicular páginas quando não há outra correspondência mais próxima. Se você não especificou o servidor padrão para usar, acredito que ele usa o primeiro que encontrar (que no seu caso é um dos seus sites HTTPS). Portanto, você deve ser capaz de criar um vhost de servidor padrão com seu endereço IPv4 para TLS (você está usando apenas TLS e não SSL, certo?) E fazer com que ele ouça o IP que capturará as solicitações HTTPS aleatórias. Talvez você também precise adicionar o item server_name aos seus 48 sites não seguros, mas pode funcionar sem isso.

#Your catch-all HTTPS server:
server {
  listen 104.218.234.204:443 default_server;
  server_name ruel.in ruel.pro;
  root /var/www/ruel.pro;
  index index.html;
  ssl on;
  ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
  ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
  ssl_dhparam /etc/ssl/private/dhparams_4096.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

#Regular HTTP server
server {
  listen ruel.in:80;
  server_name ruel.in;
  root /var/www/ruel.in;
  index index.php index.html index.htm;
  ...
}

#Regular HTTP server
server {
  listen ruel.pro:80;
  server_name ruel.pro;
  root /var/www/ruel.pro;
  index index.php index.html index.htm;
  ...
}

#Your HTTPS server
server {
  listen dallas.ruhnet.net:443 ssl;
  server_name dallas.ruhnet.net;
  ...
}

Outra alternativa é ir em frente e configurá-los com HTTPS! Com o projeto Let's Encrypt ( link ) você pode obter certificados confiáveis para todos os outros sites gratuitamente. E é bem fácil.

    
por 29.03.2016 / 20:12
0

Estou familiarizado com o problema.

Nós basicamente queremos evitar a todo custo que a primeira definição de servidor em nosso arquivo de configuração seja servida como um servidor catch-all-server para conexões SSL. Nós todos sabemos que isso é feito (oposto ao http e usando config default_server que funciona muito bem).

Isso não pode ser feito declarativamente no Nginx para SSL (ainda), então temos que codificá-lo com um IF ...

A variável $host é o nome do host da linha de solicitação ou do cabeçalho http. A variável $server_name é o nome do bloco de servidores em que estamos agora.

Portanto, se esses dois não forem iguais, você atendeu esse bloco de servidor SSL para outro host, de modo que ele deve ser bloqueado.

Podemos implementar isso em cada bloco de servidor (com uma inclusão genérica, é claro).

O código não contém referências específicas aos endereços IP ou nomes de servidor do seu servidor, para que ele possa ser facilmente reutilizado para outras configurações do servidor, sem modificação.

Exemplo:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ###
    ### Section: SSL

    #
    ## Check if this certificate is really served for this server_name
    ##   http://serverfault.com/questions/578648/properly-setting-up-a-default-nginx-server-for-https
    if ($host != $server_name) {
        #return 404 "this is an invalid request";
        return       444;
    }

    # ...
    
por 05.07.2016 / 21:15

Tags