VirtualHosts SSL baseados em nome
Esse problema ocorre se você usar vários Hosts Virtuais baseados em nome e SSL em um único endereço IP. O servidor da Web não sabe o nome do host solicitado até que o handshake SSL seja feito, porque os cabeçalhos de solicitação HTTP fazem parte do conteúdo criptografado.
Na realidade, um servidor Web como o Apache permitirá que você configure hosts virtuais SSL baseados em nome, mas sempre usará a configuração do host virtual da primeira lista (no endereço IP e na porta selecionados) para configurar o host virtual. camada de criptografia. Consulte o link para obter mais informações.
Você pode usar um certificado para vários hosts virtuais se eles estiverem no mesmo domínio usando um certificado curinga como *.example.com
, que funcionará para one.example.com
e two.example.com
.
VirtualHosts SSL com base em nome com SNI
A solução é uma extensão do protocolo SSL chamado Server Name Indication (SNI), que permite ao cliente incluir o nome do host solicitado na primeira mensagem de seu handshake SSL. Consulte o link para obter mais informações.
O Apache precisa ser construído com o OpenSSL (com a opção TLS Extensions enable-tlsext
enabled; o OpenSSL 0.9.8k e posterior tem isso habilitado por padrão)
Para verificar se sua instalação do Apache suporta o SNI, siga os seguintes passos:
Ativar NameVirtualHost para SSL em /etc/apache2/ports.conf
:
<IfModule mod_ssl.c>
NameVirtualHost *:443
Listen 443
</IfModule>
Crie dois VirtualHosts SSL em /etc/apache2/sites-available/default-ssl
<VirtualHost *:443>
ServerName www.example1.com
DocumentRoot /var/www/example1
SSLEngine on
SSLCertificateFile /etc/apache2/example1.com.cert
SSLCertificateKeyFile /etc/apache2/example1.com.key
</VirtualHost>
<VirtualHost *:443>
ServerName www.example2.com
DocumentRoot /var/www/example2
SSLEngine on
SSLCertificateFile /etc/apache2/example2.com.cert
SSLCertificateKeyFile /etc/apache2/example2.com.key
</VirtualHost>
Ativar mod_ssl:
# a2enmod ssl
Ativar o site SSL:
# a2ensite default-ssl
Reinicie o Apache:
# /etc/init.d/apache2 restart
Agora, se você seguir o log de erros do Apache e vir a seguinte mensagem, isso significa que o SNI está integrado.
[warn] Init: Name-based SSL virtual hosts only work for clients with \
TLS server name indication support (RFC 4366)
Caso contrário, você verá uma inicialização do Apache como You should not use name-based virtual hosts in conjunction with SSL!!
Agora, se você assinou seus dois certificados example1.com.cert
e example2.com.cert
com seu certificado CA, adicionou-o à lista confiável do seu navegador e seu navegador suporta SNI, você deve conseguir acessar https://www.example1.com
e https://www.example2.com
sem nenhum reclamações do seu navegador.
VirtualHosts SSL com base em nome com GnuTLS
O GnuTLS é uma implementação licenciada pela LGPL da Transport Layer Security, a sucessora do SSL. Com o GnuTLS, você pode criar um único certificado válido para vários domínios e domínios curinga, como este:
DNS Name: example1.com
DNS Name: *.example1.com
DNS Name: example2.com
DNS Name: *.example2.com
DNS Name: example3.com
DNS Name: *.example3.com
Veja link para um guia detalhado sobre como usar o GnuTLS.