Desativar HTTPS para um domínio que compartilha IP com outro domínio que está sob HTTPS

1

Estou com um problema estranho ao tentar desativar o HTTPS para um domínio, mas o outro domínio tem HTTPS. Ambos são sites diferentes em execução em um servidor dedicado, compartilhando o mesmo endereço IP para os domínios. No entanto, tenho um domínio que não possui um certificado SSL, mas o outro tem. Desejo desativar o HTTPS para o domínio não certificado enquanto deixo o outro domínio com HTTPS ativado.

Eu tenho dois vhosts separados diferentes em /etc/nginx/sites-enabled/ ,

domain1.org (sem HTTPS)

server {

    listen                      80;
    server_name                 www.domain1.org domain1.org;
    root                        /var/www/domain1.org;
    index                       index.html index.php index.htm;

    error_log                   /var/www/logs/domain1.errors.log;

    [ ... ]

domain2.com (com HTTPS)

server {

    listen                      443 ssl;
    server_name                 domain2.com www.domain2.com;

    # INCLUDE SSL CERTIFICATE
    include                     sites-enabled/domain2_ssl_include; 

    root                        /home/domain2/www/www;
    index                       index.html index.php index.htm;

    [ ... ]

Eu incluí um ouvinte na porta 443 para domain1.org, mas uma vez que faço isso, recebo um erro abortado do Firefox (ao acessar link ):

This Connection is Untrusted

You have asked Firefox to connect securely to domain1.org, but we can't confirm that your connection is secure.

Eu abri os dados técnicos, parece que o domain1.org está usando o certificado SSL domain2.com:

domain1.org uses an invalid security certificate.

The certificate is only valid for the following names: *.domain2.com , domain2.com

(Error code: ssl_error_bad_cert_domain)

Então, adicionei isso à configuração vhost do domínio1.org:

server {

    server_name                 domain1.org www.domain1.org;

    listen                      443 ssl;

    rewrite ^ http://domain1.org permanent;
}

O que ainda me faz com o erro do Firefox.

Agora ... quando eu acesso ao link , recebo um erro 400 do nginx dizendo isto:

400 Bad Request

The plain HTTP request was sent to HTTPS port

Não tenho certeza do que fazer, desabilitar os https com ssl off; não tem efeito. Como posso realmente desativar HTTPS para domain1.org, mas não para domain2.com?

Estou usando o Ubuntu 12.04 executando o nginx 1.2.6.

    
por MacMac 03.07.2013 / 21:37

3 respostas

3

Você não poderá fazer o que quiser. Você também:

  1. É necessário obter um certificado válido para ambos os domínios e usar as diretivas serverHost para redirecionar o SSL (para http: //) se você realmente não quiser executar o SSL nesse domínio.
  2. É necessário obter um segundo endereço IP e executar os domínios em endereços IP separados.
  3. Deixar o SSL ativado e exibir um certificado inválido para o domínio1

PORQUE:

  1. Um cliente digita link em um navegador
  2. O navegador resolve isso para uma conexão TCP na porta 443
  3. A magia da Internet roteia esta conexão para o seu servidor e, esperamos, para o seu software de servidor web
  4. O navegador do cliente está de pé na porta da frente, aguardando o "aperto de mão secreto" apropriado (Certificado SSL).
  5. Seu servidor tenta o único handshake que conhece (o que está errado)
  6. O navegador do cliente informa ao cliente que "Esse cara na porta do domínio1.com ... Ele não é quem ele diz que é. Isso é superficial"
  7. Hoje, você clicará na variante de "Proceed Anyway" que o navegador apresenta
  8. SE você desativar o SSL no domínio1.com, o usuário verá o outro site ( bastante confuso para o usuário )
  9. SE você deixar o SSL ativado no domínio1.com, os navegadores e servidores da Web modernos se comunicarão e mostrarão o site correto. ( embora, com um aviso assustador)

Se você pretende hospedar domain1.org @ ip na porta 80 e domain2.org em ip na porta 443 (para que domain2 não tenha acesso HTTP, ele deve funcionar). Remova o ouvinte 443 para domain1. Você será perguntado se algum usuário audacioso digitar link (e mostrará domínio2). Essa configuração é essencialmente hospedagem virtual baseada em porta. Em vez de escolher portas aleatórias, você selecionou os dois padrões e os deu para separar os hosts virtuais. Em última análise, nesta configuração (com o SSL em volta), o servidor da Web não se importa realmente com o domínio que o navegador está pedindo no cabeçalho do Host. O servidor web apenas se preocupa com o combo ip: port em hosts virtuais baseados em portas.

    
por 03.07.2013 / 23:55
0

Na medida em que entendo o que você está tentando fazer, é impossível. SSL é ativado em um endereço IP e porta ou não é. O nome do host que você usa para alcançar esse endereço IP não afeta o próprio SSL, exceto que alguns navegadores o enviam durante o processo de negociação. Mas se você desativasse o SSL, não haveria negociação e você não saberia qual host eles estavam tentando acessar. Então isso não funciona.

    
por 03.07.2013 / 22:26
0

Esse é um problema bastante comum em sites http e https e não apenas em um problema Nginx. Você pode ter o mesmo com o Apache, IIS ... e tudo mais.

Como resolver isso corretamente

Adquira um endereço IP adicional para o seu servidor Web e inclua domain2.org no novo IP (IP # 2). Além disso, tome cuidado para que seu servidor Web esteja escutando apenas na porta 80 via IP # 1 e esteja escutando nas portas 80 e 443 via IP # 2.

Solução alternativa se o segundo IP não for possível

Se um endereço IP adicional não for possível, você só poderá implementar uma solução alternativa. Ative o SSL / TLS para domain1.org com o certificado de domain2.org e forneça um redirecionamento para o link como você já fez. Os usuários receberão avisos de SSL / TLS de qualquer maneira e a maioria deles ignora esses avisos. Mas eles são encaminhados para o URL correto.

Exemplo de configuração para o nginx:

ssl_certificate                 /etc/ssl/certs/domain2.org.pem;
ssl_certificate_key             /etc/ssl/private/domain2.org.key;
ssl_protocols                   SSLv3 TLSv1;
ssl_prefer_server_ciphers       on;
ssl_ciphers                     AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH;
ssl_session_cache               shared:SSL:10m;

# domain1.org
server {
    listen          80;
    listen          [::]:80;
    server_name     domain1.org;
    # your configuration part ...
}
server {
    listen          443 ssl spdy;
    listen          [::]:443 ssl spdy;
    server_name     domain1.org;
    return          301 http://domain1.org/;  # enforce correct protocol
}

# domain2.org
server {
    listen          80;
    listen          [::]:80;
    server_name     domain2.org;
    return          301 https://domain2.org/;  # enforce correct protocol
}
server {
    listen          443 default_server ssl spdy;
    listen          [::]:443 default_server ssl spdy;
    server_name     domain2.org;
    # your configuration part ...
}
    
por 04.07.2013 / 20:37