Como configurar o Apache NameVirtualHost em SSL?

5

Eu gostaria de definir o registro A de dois DNS para apontar para a minha intuição no Ubuntu. O Apache deve então ler o nome do domínio de acordo e apontar o pedido recebido para o caminho físico correto.

Eu configurei tudo Este é o conteúdo do /etc/apache2/ports.conf

Me preocupa que os usuários do WinXP não possam acessar o meu site SSL de acordo com o comentário abaixo, então, como devo fazer isso de maneira diferente?

NameVirtualHost *:80
Listen 80

<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>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

A maioria das pessoas tem o WinXP e o Internet Explorer, o que é um pouco preocupante. Como posso definir o SSL de forma diferente para que funcione para todos?

    
por Houman 15.01.2012 / 21:37

4 respostas

10

Usar vários nomes de host no mesmo servidor Apache Httpd (e qualquer servidor HTTPS para esse assunto) apresenta dois problemas:

  • Para que a conexão seja segura, o cliente deve primeiro verificar o certificado do servidor.
  • Se houver vários certificados disponíveis para o servidor, o servidor deve conseguir qual certificado escolher a partir da solicitação do cliente.

HTTPS é HTTP sobre SSL / TLS: o handshake SSL / TLS, que estabelece o túnel seguro, é iniciado pelo cliente logo após a criação da conexão TCP, antes que qualquer troca de HTTP seja feita. Todo o tráfego HTTP subseqüente da troca HTTPS é feito através dessa conexão SSL / TLS.

O certificado do servidor é enviado pelo servidor como parte do handshake SSL / TLS. O processo de verificação depende de (a) verificar se o certificado é confiável e (b) verificar se ele foi emitido para o servidor que o cliente pretendia contatar. Há mais detalhes em esta resposta no StackOverflow .

Em HTTP, o nome do host solicitado é enviado no cabeçalho HTTP Host . É assim que os hosts virtuais baseados em nome funcionam: o despacho é feito com base no cabeçalho Host internamente no Apache Httpd.

No entanto, o cabeçalho HTTP Host não está disponível para o Apache Httpd antes que o SSL / TLS seja concluído com êxito. Assim, não está disponível antes do envio do certificado do servidor.

Existem duas maneiras de ajudar o Apache Httpd a escolher qual certificado usar durante o handshake, sem depender de nenhum tráfego HTTP:

  • Usando um certificado por combinação de endereço IP / porta. Essa é a maneira tradicional.
  • Usando a extensão de Indicação de nome de servidor de SSL / TLS , envie durante o handshake SSL / TLS, que estabelece a segurança túnel. O problema com essa opção é que nem todos os navegadores a suportam. Em particular, não é suportado em nenhuma versão do IE no XP (e alguns navegadores móveis, eu acho).

Se você não puder usar o SNI ou tiver vários endereços IP em seu servidor, poderá usar um certificado válido para todos os nomes de host que deseja veicular. Isso pode ser feito usando:

  • um certificado emitido para um nome curinga (mas seu uso é desencorajado ) ou
  • um certificado com várias entradas DNS de nome alternativo de assunto. Esta deve ser sua opção preferida.

Se você realmente quiser experimentar o SNI, ele deve funcionar com uma versão recente do Apache Httpd 2, usando uma versão recente do OpenSSL (se estiver usando mod_ssl conforme fornecido com a base do código principal). Isso está documentado aqui: link

    
por 15.01.2012 / 22:57
2

O aviso SSL é sobre sites SSL baseados em nome . O SSL tradicional criptografa a conexão antes do envio do tráfego HTTP, criptografa a conexão TCP em vez da sessão HTTP, se não me engano. Como os hosts virtuais são selecionados dentro do protocolo HTTP e o servidor precisa configurar uma conexão segura antes da utilização do http, você pode escolher apenas um certificado por combinação de IP / porta. Por padrão, o site ssl defualt.

Isso mudou porque agora você pode usar o TLS ( gnutls ) para criptografia, que é na verdade 'nova versão' do SSL e permite a criptografia baseada em nome. No entanto, isso não é suportado em sistemas operacionais e navegadores mais antigos, como o Windows XP.

É possível se você usar o firefox ou o chrome no XP, em vez do IE, funciona muito bem.

Se você quiser que ele funcione a qualquer momento, configure vários IP's e / ou portas para versões SSL de sites. Se você tem apenas um site que precisa de SSL, nenhuma configuração adicional é necessária

Editar: pergunta alterada também

    
por 15.01.2012 / 22:16
0

Outra possibilidade, se você tiver apenas um IP para vários nomes de domínio SSL, é configurar apenas o < VirtualHost _default_: 443 > para uma raiz de documento padrão e dentro dela, use um RewriteRule para cada nome de domínio que precisa ser servido de uma raiz de documento diferente. Por exemplo:

<VirtualHost _default_:443>

    DocumentRoot /var/www/https_one

    ... 

    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^https_two\.example\.com$
    RewriteRule (.*) /var/www/https_two/$1

    RewriteCond %{HTTP_HOST} ^https_three\.example\.com$
    RewriteRule (.*) /var/www/https_three/$1
</VirtualHost>

Como o mod_rewrite é executado quando os cabeçalhos já são enviados, isso praticamente contorna o problema de identificar o host HTTP na fase de handshake do SSL. Você ainda precisa de um certificado válido para todos os nomes de domínio, assumindo que não deseja que seus visitantes solicitem a aceitação de uma exceção de segurança pelo navegador.

    
por 24.07.2013 / 15:41
-1

Embora a resposta fornecida por @Bruno acima realmente resolva os motivos e porquês, deixa a questão de como configurar virtualhosts baseados em nome SSL / TLS habilitado com uma solução menos que viável - adiando em vez disso a ligação de alguém (ou compra de seu provedor de hospedagem) endereços IP adicionais para sua máquina e, dependendo, também alterando os parâmetros de escuta para httpd.conf

IOW, não há uma solução na resposta do @ Bruno - você deve usar virtualhosts baseados em IP.

@ocsarjd, por outro lado, aborda como fornecer suporte para hosts SSL virtuais baseados em nome, além de uma solução alternativa para pessoas que insistem em executar, digamos, IE no XP.

Usando:

<VirtualHost _default_:443>

e, em seguida, o mod_rewrite fornece suporte para navegadores incapazes de tirar proveito do SNI e, portanto, ninguém precisa comprar e / ou vincular endereços IP adicionais ao servidor para que o Apache escute conexões em um método de host virtual baseado em IP.

Ironicamente, a resposta de @ Bruno abrange todas as razões como e por que essas negociações ocorrem e como os navegadores obsoletos não conseguem negociar a incorporação adequada de hospedagem virtual SSL baseada em nome em um servidor Apache.

Como já passou algum tempo desde que o OP fez esta pergunta, eu recomendaria que NÃO acomodássemos esses navegadores obsoletos, porque essa é uma escolha que a pessoa do cliente fez para operar software inseguro, que na minha opinião é simplesmente alguém para ser ignorado ....

Dito isto, um host virtual SSL padrão com informações semelhantes a uma página 404 personalizada informando ao visitante que eles estão operando um cliente de navegador inseguro estaria em ordem aqui por mais alguns anos, porque certamente haverá pessoas que se recusam a parar de usar uma versão do IE que não recebeu patches desde que o XP foi EOL e todos os (assim chamados) navegadores "modernos" (IE / Edge, Firefox, Chrome / Chromium, Opera, Safari) acomodam recursos de hospedagem virtual baseada em nome via HTTPS via SNI.

    
por 02.03.2016 / 22:15