Dois domínios (quando SSL) no mesmo diretório

1

Minha configuração do apache2 é problemática: tenho dois sites em um servidor:

  • domain1.tdl
  • domain2.tdl

Um deles (domain2.tdl) deve estar acessível na porta 443 (com SSL). Todos os domínios devem ser e podem ser acessados pela porta 80. Mas quando tentamos acessar o domain1.tdl na porta 443, os arquivos domain2.tdl são exibidos. Portanto, na porta 443, domain2.tdl é acessível por domain1.tdl e domain2.tdl. Eu não quero isso!

Minha configuração:

domain1.tdl :

<VirtualHost *:80>
  DocumentRoot /home/sites/domain1.tdl/www
  ServerName domain1.tdl
  ServerAlias www.domain1.tdl
  ServerAdmin [email protected]
  RewriteEngine on
  <Directory "/home/sites/domain1.tdl/www">
    AllowOverride All
    allow from all
    Options -Indexes
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot /home/sites/domain1.tdl/www
  ServerName domain1.tdl
  ServerAlias www.domain1.tdl
  ServerAdmin [email protected]
  RewriteEngine on
  <Directory "/home/sites/domain1.tdl/www">
    AllowOverride All
    allow from all
    Options -Indexes
</Directory>

domain2.tdl :

<VirtualHost *:80>
  DocumentRoot "/home/sites/domain2.tdl/web"
  ServerName domain2.tdl
  ErrorLog /var/log/apache2/site/error_domain2.tdl.log              
  CustomLog /var/log/apache2/site/access_domain2.tdl.log combined
  <Directory "/home/sites/domain2.tdl/web">
    allow from all
    Options -Indexes
  </Directory>
  ServerAlias www.domain2.tdl
</VirtualHost>

<VirtualHost domain2.tdl:443>
  DocumentRoot "/home/sites/domain2.tdl/web"
  ServerName domain2.tdl
  ErrorLog /var/log/apache2/site/error_domain2.tdl.log
  CustomLog /var/log/apache2/site/access_domain2.tdl.log combined

  SSLEngine on
  SSLCertificateFile /etc/ssl/private/domain2.tdl/domain2.tdl.crt
  SSLCertificateKeyFile /etc/ssl/private/domain2.tdl/domain2.tdl.key
  SSLCACertificateFile /etc/ssl/private/domain2.tdl/GandiStandardSSLCA.pem
  SSLVerifyClient None

  <Directory "/home/sites/domain2.tdl/web">
    allow from all
    Options -Indexes
  </Directory>
  ServerAlias www.domain2.tdl
</VirtualHost>
    
por bux 14.05.2013 / 12:08

1 resposta

1

Explicação

Quando você estiver usando NameVirtualHosts, o Apache usará o nome do host fornecido no cabeçalho Host: para determinar qual dos hosts virtuais você deve acessar. Isso tem sido historicamente problemático com o SSL - já que a sessão inteira é criptografada, incluindo o cabeçalho Host:, o Apache precisa descriptografar a sessão antes de determinar qual host virtual usar. Mas a informação necessária para fazer a descriptografia está dentro de uma seção do VirtualHost, criando uma captura 22 - o apache precisa de um VirtualHost, mas não pode saber qual, então ele escolherá o primeiro que encontrar.

Implementações mais recentes de SSL incluem SNI, o que torna possível dar o nome do host não criptografado. Mas, para que isso funcione, tanto o servidor quanto o cliente precisam executar versões bastante recentes do SSL e, embora você possa controlar o servidor, geralmente não é possível controlar o cliente.

Solução

Primeiro, como você não deseja que o domínio1.tdl seja acessado por SSL, basta remover a seção VirtualHost:443 do domínio1. (Isso não resolverá esse problema atual, mas você não deve manter a configuração por perto se não quiser usá-lo; em algum momento, irá lhe causar problemas!)

Em segundo lugar, você precisará criar uma maneira de verificar o nome do host correto após a negociação do SSL e permitir somente o tráfego para o nome do host correto. A maneira mais simples seria usar mod_rewrite e fazer uma verificação de cabeçalho, e rejeitar todo o tráfego sem o hostname correto. Aqui está um exemplo:

RewriteEngine On # to turn rewriting on

RewriteCond %{HTTP_HOST} ^(www.)?domain2.tdl   # If http_host doesn't match (www.)domain2.tdl
RewriteRule (.*) http://%{HTTP_HOST}/$1    # then redirect to http for the hostname that was used, keeping the path intact

Se preferir que eles saibam que o acesso não é permitido, você pode enviar uma mensagem de erro:

RewriteEngine On # to turn rewriting on

RewriteCond %{HTTP_HOST} ^(www.)?domain2.tdl   # If http_host doesn't match (www.)domain2.tdl
RewriteRule (.*) - [F]                     # then issue a "403 Forbidden" error page

Estes comandos devem estar dentro da diretiva VirtualHost para domain2.tdl: 443.

    
por 14.05.2013 / 12:51