Como dizer ao nginx para servir https apenas para um domínio gerenciado por vhost?

5

Eu tenho uma instância ec2 executando o Ubuntu e o nginx 0.8.4, com vhosts servindo vários domínios diferentes usando http, mas um usando SSL / https.

Configuração segura de domínio:

server {
    listen 443 ssl;
    server_name "securedomain.tld";

    ssl_certificate     /etc/nginx/certs/securedomain.tld.crt;
    ssl_certificate_key /etc/nginx/certs/securedomain.tld.key;

    if ($host != $server_name) {
        return 444; # this won't work because HTTPS communication has 
                    # been already started, warning message is displayed
    }

    // ...
}

Configuração de domínio insegura:

server {
    listen 80; 
    server_name "unsecuredomain.tld";

    // ...
}

No momento, o domínio veiculado usando https está alcançando all o tráfego https, para todos os domínios gerenciados…, ou seja, link exibirá um aviso e realmente exibirá o conteúdo de securedomain.tld : (

A pergunta é, existe uma maneira de impedir que o nginx atenda todos os domínios não seguros atendidos usando https? por exemplo, especificando que você deseja apenas aceitar conexões https para um determinado host solicitado…

Dica: uma instância ec2 não pode ter mais de um IP afetado.

    
por NiKo 07.03.2012 / 11:33

2 respostas

4

Em suma: não. No que diz respeito ao nginx, você disse que todas as conexões com a porta 443 são conexões SSL para esse vhost, e está apenas fazendo o que você disse. No momento em que ele puder ver o cabeçalho Host: na solicitação, a negociação do SSL foi feita (ausente o SNI, que realmente só ajudará se você tiver certs para todos os seus domínios e estiver sendo atingido por um SNI- navegador ciente).

    
por 07.03.2012 / 12:11
2

O aviso de incompatibilidade de SSL é imprevisível sem um segundo endereço IP ou algum tipo de configuração de proxy, como observa o womble.

Se você quiser impedir que o conteúdo unsecuredomain.tld seja veiculado por SSL, você deve usar algo como o seguinte na definição de vhost SSL securedomain.tld em vez do que você tem:

if ($host != $server_name) {
    rewrite ^(.*)$ http://unsecuredomain.tld permanent;
}

e apenas rejeitá-los, em vez de gerar um erro de HTTP diferente depois que eles já receberam o aviso do navegador e optaram por continuar.

    
por 07.03.2012 / 12:21

Tags