Este tópico descreve como resolver exceções de acesso HTTPS decorrentes de problemas de compatibilidade com Server Name Indication (SNI) entre clientes após a adição dos serviços web correspondentes ao Web Application Firewall (WAF).
Contexto
A hospedagem virtual surgiu para solucionar a escassez de endereços IP. Esse recurso permite que um único servidor HTTP ou HTTPS hospede vários nomes de domínio compartilhando o mesmo endereço IP. Nesse cenário, cada nome de domínio funciona como um host virtual. O servidor distribui as solicitações para os diferentes hosts virtuais com base nos cabeçalhos Host presentes nas requisições do cliente. Por exemplo, antes de acessar um site HTTPS hospedado em um servidor web com hospedagem virtual ativada, o navegador precisa estabelecer uma conexão SSL com o servidor e solicitar o certificado necessário. No entanto, sem SNI, o servidor não identifica qual nome de domínio está sendo acessado e não pode retornar o certificado correto.
O SNI é uma extensão SSL/TLS criada para resolver esse problema. Antes de estabelecer a conexão SSL com o servidor, o navegador envia o hostname que especifica o nome de domínio a ser acessado. Assim, o servidor identifica o domínio e retorna o certificado adequado.
A maioria dos sistemas operacionais e navegadores oferece suporte ao SNI. O OpenSSL 0.9.8 já inclui suporte nativo ao SNI. Versões recentes de servidores NGINX também são compatíveis com essa extensão.
Descrição do problema
Se seu site apresentar exceções de acesso HTTPS após a adição ao WAF, os clientes envolvidos podem não ter suporte ao SNI.
Quando um navegador sem suporte ao SNI acessa um site protegido pelo WAF, o serviço não identifica o nome de domínio específico da solicitação nem obtém o certificado correspondente para interagir com o navegador. Nessa situação, o WAF utiliza o certificado padrão para concluir o processo de handshake com o navegador, o que faz com que o navegador exiba o erro "Certificate not trusted".
Se um cliente não oferecer suporte ao SNI, podem ocorrer os seguintes problemas:
Para aplicativos móveis executados no iOS, o acesso ocorre normalmente. Em aplicativos móveis no Android, o acesso falha.
Em navegadores, o sistema exibe o erro "Certificate not trusted".
Solução
Capture pacotes de handshake SSL no lado do cliente para verificar se há suporte ao SNI. Neste exemplo, utilizamos o navegador Chrome para acessar o site oficial da Alibaba Cloud.
Se o pacote Client Hello contiver informações de SNI, o cliente tem suporte à extensão.
Caso contrário, o cliente não oferece suporte ao SNI. Recomendações:
Atualize seu navegador ou utilize versões mais recentes, como Chrome e Firefox.
Em cenários de callback de terceiros, como callbacks do WeChat ou Alipay, utilize o endereço IP do servidor de origem para contornar o WAF.
Compatibilidade com SNI
O SNI é compatível com TLS 1.0 e versões posteriores, mas não tem suporte em SSL.
-
Os seguintes navegadores desktop oferecem suporte ao SNI:
Chrome 5 e versões posteriores
Chrome 6 e versões posteriores (Windows XP)
Firefox 2 e versões posteriores
IE 7 e versões posteriores (no Windows Vista/Server 2008 e posteriores, exceto qualquer versão do IE no Windows XP)
Konqueror 4.7 e versões posteriores
Opera 8 e versões posteriores
Safari 3.0 no Windows Vista/Server 2008 e versões posteriores ou Mac OS X 10.5.6 e versões posteriores
-
As seguintes bibliotecas oferecem suporte ao SNI:
GNU TLS
Java 7 e versões posteriores (apenas como cliente)
HTTP client 4.3.2 e versões posteriores
libcurl 7.18.1 e versões posteriores
NSS 3.1.1 e versões posteriores
OpenSSL 0.9.8j e versões posteriores
OpenSSL 0.9.8f e versões posteriores (requer flags)
QT 4.8 e versões posteriores
Python3, Python 2.7.9 e versões posteriores
-
Os seguintes navegadores móveis oferecem suporte ao SNI:
Android Browser no 3.0 Honeycomb e versões posteriores
iOS Safari no iOS 4 e versões posteriores
Windows Phone 7 e versões posteriores
-
Os seguintes servidores oferecem suporte ao SNI:
Apache 2.2.12 e versões posteriores
Apache Traffic Server 3.2.0 e versões posteriores
HAProxy 1.5 e versões posteriores
IIS 8.0 e versões posteriores
lighttpd 1.4.24 e versões posteriores
LiteSpeed 4.1 e versões posteriores
Nginx 0.5.32 e versões posteriores
-
As seguintes interfaces de linha de comando oferecem suporte ao SNI:
cURL 7.18.1 e versões posteriores
wget 1,14 e versões posteriores