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