apache2 virtualhosts para # subdomínios com reescrita para SSL

3

Tenho tido alguns problemas ao configurar o meu servidor da web do apache para servir apenas páginas através de https. Acho que acertei no começo desta semana, mas depois de alguns ajustes parece que eu quebrei de novo e não sei quando exatamente eu quebrei.

Minha configuração produz essa saída e, portanto, minha sintaxe de configuração deve estar correta:

# apache2ctl -t -D DUMP_VHOSTS
VirtualHost configuration:
192.168.0.1:80         is a NameVirtualHost
default server cal.example.com (/etc/apache2/sites-enabled/99-davical:2)
port 80 namevhost cal.example.com (/etc/apache2/sites-enabled/99-davical:2)
port 80 namevhost proius.example.com (/etc/apache2/sites-enabled/proius:1)
port 80 namevhost slnew.example.com (/etc/apache2/sites-enabled/slnew:1)
port 80 namevhost webmail.example.com (/etc/apache2/sites-enabled/webmail:1)
192.168.0.1:443        is a NameVirtualHost
default server proius.example.com (/etc/apache2/sites-enabled/proius:10)
port 443 namevhost proius.example.com (/etc/apache2/sites-enabled/proius:10)
port 443 namevhost slnew.example.com (/etc/apache2/sites-enabled/slnew:10)
port 443 namevhost webmail.example.com (/etc/apache2/sites-enabled/webmail:10)
192.168.0.1:8443       is a NameVirtualHost
default server cal.example.com (/etc/apache2/sites-enabled/99-davical:11)
port 8443 namevhost cal.example.com (/etc/apache2/sites-enabled/99-davical:11)
Syntax OK

É assim que todos os meus virtualhosts são definidos:

<VirtualHost slnew.example.com:80>
 ServerName      slnew.example.com
 ServerAdmin     [email protected]
 DocumentRoot    /var/www/slnew
 RewriteEngine   On
 RewriteLogLevel 0
 RewriteRule     ^/(.*) https://slnew.example.com:443/$1 [L,R]
</VirtualHost>
<VirtualHost slnew.example.com:443>
 ServerName      slnew.example.com
 ServerAdmin     [email protected]
 DocumentRoot /var/www/slnew
 <Directory /var/www/slnew>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
 </Directory>
 LogLevel info
 ErrorLog ${APACHE_LOG_DIR}/slnew_error.log
 CustomLog ${APACHE_LOG_DIR}/slnew_access.log combined
 SSLEngine               on
 SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
 SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
 SSLProtocol             -all +SSLv3 +TLSv1
 SSLCipherSuite          SSLv3:+HIGH:+MEDIUM
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
  SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
  SSLOptions +StdEnvVars
 </Directory>
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>

Quando visito meus sites, recebo esse erro no Google Chrome:

Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.
    
por zenlord 11.01.2012 / 12:07

1 resposta

4

Você não pode executar vários virtualhosts baseados em nome SSL na mesma combinação IP: porta.

O Apache não tem como saber qual você quer, já que o cabeçalho Host: não é enviado até que o canal seguro seja estabelecido, e para estabelecer o canal seguro, o apache precisa selecionar um certificado para usar. Este é um problema de galinha e ovo.

Mas, além disso, você está tentando acessar o conteúdo HTTP por meio de uma conexão SSL, o que produz o erro relatado. Este é um problema diferente do certificado.

Regra # 0: não use EVER, use nomes de host em uma definição de virtualhost. Ever.

Regra # 1: NÃO use reescreve quando qualquer outra coisa servir.

No caso de redirecionar HTTP para HTTPS, você cria quantos hosts virtuais HTTP (porta 80), como você tem SSL vhosts, e, em seguida, redireciona para a versão SSL para cada um.

Você parece ter implementado 80% disso e, em seguida, desistiu e achou que usar as reescritas era uma solução adequada:)

Em vez disso, substitua TODAS as opções acima por:

<VirtualHost *:80>
  ServerName slnew.example.com
  Redirect Permanent / https://slnew.example.com/
</Virtualhost>

Agora, a porção SSL pelo menos deixará de causar erros, mas você receberá o aviso de certificado para cada host virtual SSL que não seja o CN canônico para o certificado escolhido (o apache sempre escolherá o certificado definido no primeiro SSL vhost.)

Se você realmente quer que isso funcione corretamente, cada vhost precisa ter seu próprio IP, que você usa na definição do Virtualhost:

<Virtualhost 55.66.77.88:443>
  ServerName slnew.example.com

etc.

    
por 11.01.2012 / 13:14