Problemas Nginx entre vhosts e SSL

3

Eu tenho dois sites no mesmo IP com a seguinte configuração:

  • site1.com
    • Múltiplos subdomínios (ex .: foo.site1.com, bar.site1.com)
    • Tudo escutando na porta 80, NADA em 443
  • site2WithSSL.com
    • Ouvindo as portas 80 e 443 (SSL)

Eu posso acessar o link e o link sem problemas . O problema surge quando alguém deseja acessar o link : //site1.com, as respostas do nginx com o site2WithSSL.com. Eu quero evitar isso. Quero dizer, sempre que alguém acessar o link : //site1.com, nenhum conteúdo deve ser retornado ou apenas um redirecionamento para o link : //

A configuração é:

server {
     listen      80;
     server_name    *.site1.com;

     // ...
}

server {
     server_name www.site2WithSSL.com;
     return 301 $scheme://site2WithSSL.com$request_uri;
}

server {
     listen 80;
     listen 443 ssl;
     server_name site2WithSSL.com;
     ssl_certificate site2WithSSL.crt;
     ssl_certificate_key site2WithSSL.key;

     // ...
 }

RESOLVIDO: usando um ip diferente para cada site

    
por blacksoul 19.03.2014 / 15:08

3 respostas

3

Seu problema é que o SSL não suporta vários vhosts no mesmo IP.

Quando o NGINX recebe uma nova conexão via HTTP / 1.1, a solicitação inclui um cabeçalho HOST que especifica qual host virtual deve ser exibido (essa foi a grande mudança na versão 1.1 e permite hosts virtuais como os conhecemos hoje).

Mas, com HTTPS, os cabeçalhos são criptografados e a troca de chaves e a camada TLS devem ser estabelecidas antes de serem descriptografadas. Em outras palavras, não há como o nginx escolher o bloco de servidores SSL adequado até que seja enviado um certificado SSL.

Você pode adicionar um nome de domínio do site1 de redirecionamento correspondente na configuração do site2, mas o usuário ainda receberia uma mensagem informando que o certificado era inválido, o que não é muito palatável.

Existem alguns certificados de vários domínios que você pode usar, embora isso possa custar caro.

O mais fácil, e para a sua configuração desejada, provavelmente a melhor opção, é usar um endereço IP diferente para cada site. As diferentes configurações do servidor NGINX podem ser vinculadas a endereços diferentes para que nunca haja dúvidas sobre qual é qual. A maioria dos provedores pode fornecer vários endereços IP, alguns até vários blocos e, é claro, na nuvem, você pode provisionar mais.

update: O SNI contorna esse problema movendo o cabeçalho do Host para fora da carga criptografada e é suportado pelos navegadores modernos.

    
por 19.03.2014 / 21:51
2

Não é possível escutar na porta 443 no mesmo IP por apenas um site, porque ele só sabe qual site o cliente deseja ter do cliente SSL Hello. Depois de receber o Hello, ele tem a opção de concluir o handshake SSL ou cortar a conexão. No primeiro caso, você precisa fornecer um certificado, no último caso, o cliente receberá algum erro inútil sobre a conexão SSL quebrada.

No final, resume-se às seguintes opções:

  • Corte a conexão e cause alguma mensagem de erro estranha no cliente (não sei se você poderia ativar esse comportamento com o nginx).
  • Sirva o mesmo certificado de site2WithSSL.com e redirecione o cliente para http. Infelizmente, o redirecionamento será feito após o handshake SSL e esse handshake SSL causará um erro nos clientes, pois o nome do host não corresponde ao certificado.
  • Use um certificado autoassinado para site1 e redirecione para http-only: mesmo problema porque o cliente não aceitará o certificado.
  • Use um certificado real para site1, mesmo se você usá-lo apenas para redirecionar para http.

Apenas a última opção funcionará sem erros no cliente.

    
por 19.03.2014 / 21:03
0

Eu estava pensando em uma configuração para site1.com ouvindo na porta 443 sem ssl que somente redireciona para o link . Eu acho que deveria funcionar sem a necessidade de um novo endereço IP.

    
por 08.11.2014 / 17:34