O namevhosts do Apache SNI sempre rotear para a primeira entrada do VirtualHost

5

O Apache parece rotear todas as solicitações https para o primeiro <VirtualHost *:443> , independentemente da correspondência do SNI nos campos ServerName / ServerAlias.

Apache é construído com SNI
Versão do servidor: Apache / 2.2.22 (Ubuntu)
Servidor construído: Mar 8 2013 15:53:13
OpenSSL 1.0.1 14 de março de 2012

relatórios error.log:

Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)

O que sugere que o SNI está funcionando de acordo com o link (Como você pode saber se a sua compilação do Apache suporta o SNI?)

SSL_TLS_SNI parece estar definido adequadamente quando solicitado usando HTTPS (verificado com phpinfo() )

Configuração:

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    NameVirtualHost *:443
    Listen 443
</IfModule>

#<VirtualHost *:443>
#       <Location />
#               Order allow,deny
#               Deny from all
#       </Location>
#</VirtualHost>

<VirtualHost *:443>
        SSLEngine on
        ServerAdmin webmaster@localhost
        ServerName server.com
        ServerAlias server.com
        DocumentRoot /web/default
        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLCertificateFile /path/server.com.crt
        SSLCertificateKeyFile /path/server.com.key
</VirtualHost>
<VirtualHost *:443>
        SSLEngine on
        ServerAdmin webmaster@localhost
        ServerName alias.com
        ServerAlias alias.com
        DocumentRoot /web/default
        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLCertificateFile /path/alias.com.crt
        SSLCertificateKeyFile /path/alias.com.key
</VirtualHost>

O link e o link tentam exibir o certificado (e conteúdo se você desconsiderar o aviso do certificado) do server.com

Configuração semelhante funciona bem usando HTTP: 80 (somente a mudança é SSLEngine e os caminhos de certificado / chave)

Se eu descomentar o primeiro host virtual (restringindo o acesso HTTPS a sites que estão definidos), eu sempre recebo um erro SSL (mesmo que seja um site definido)

Obrigado

EDITAR:
Bandeiras adicionais

SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLStrictSNIVHostCheck on
SSLVerifyClient none
SSLProxyEngine off

SSLStrictSNIVHostCheck on , por isso só deve suportar navegadores ativados por SNI de qualquer maneira

apache2ctl -S output:

*:443                  is a NameVirtualHost
         default server server.com (/etc/apache2/sites-enabled/000-default:22)
         port 443 namevhost server.com (/etc/apache2/sites-enabled/000-default:22)
         port 443 namevhost alias.com (/etc/apache2/sites-enabled/000-default:39)
         port 443 namevhost other.com (/etc/apache2/sites-enabled/other:22)
    
por arcyqwerty 23.05.2013 / 09:13

3 respostas

4

Atualizar

Então, por alguma estranha razão, o problema parece ter se resolvido.
Talvez seja algum tipo de problema de cache estranho ou algo assim (embora eu tenha apache2ctl stop/start/restart e sudo service apache2 stop/start/restart/reload ed muitas vezes e tenha realizado testes localmente no servidor, bem como usando várias máquinas diferentes).

Sinta-se à vontade para retirar esta questão ou deixá-la se ela servir como qualquer tipo de referência.
Obrigado por todos os caras de ajuda!

    
por 23.05.2013 / 19:17
1

Sua configuração parece OK; A diretiva SSLEngine On foi incluída; De acordo com a mensagem de log, parece que o problema vem do lado do cliente.

Nem todos os clientes suportam o SNI, porém a maioria deles suporta. Depende de como a negociação SSL é feita, pelo sistema (não funciona no Win XP então) ou pelo navegador (a versão deve ser recente o suficiente). Veja a lista de navegadores com suporte a SNI . Se você deve garantir que todos os clientes tenham acesso aos seus sites, não será possível usar o SNI por causa dessas versões antigas (do navegador ou do sistema). Você precisaria de um IP por ServerName e usaria VirtualHost $ IP_alias: 443 para ServerName alias.com e VirtualHost $ IP_server: 443 para ServerName server.com em vez de VirtualHost *: 443 para ambos.

    
por 23.05.2013 / 10:12
0

Você recebe um erro com o primeiro host virtual porque, não tendo incluído a diretiva SSLEngine on , o Apache envia uma resposta HTTP sem SSL. Se você quiser esse tipo de funcionalidade, você teria que configurar outro site (possivelmente com outro certificado, a menos que você reutilize um domínio existente) para o vhost padrão, mesmo que tudo que você queira fazer seja retornar um erro legal.

Talvez verifique se os certificados são realmente diferentes? Sua configuração parece correta.

Além disso, verifique se não há outras seções de VirtualHost ouvindo na porta 443. O Apache selecionará o que melhor corresponde, significando que, se algo é mais específico para o endereço no qual a conexão entrou, essa entrada levará precedência. Eu não acho que isso seja problema seu.

Além disso, como um ponto de interesse, o que você está vendo do lado do usuário é o que aconteceria se o cliente não suportasse o SNI na maioria dos casos.

    
por 23.05.2013 / 09:59