Este tópico descreve como resolver exceções de acesso HTTPS causadas por problemas de compatibilidade com Server Name Indication (SNI) nos clientes, após a adição dos serviços web ao Web Application Firewall (WAF).
Contexto
O virtual hosting foi criado para enfrentar o desafio da escassez de endereços IP. Esse recurso permite que um único servidor HTTP ou HTTPS hospede múltiplos domínios compartilhando o mesmo endereço IP — cada domínio funciona como um virtual host. O servidor distribui as requisições para os diferentes virtual hosts com base no cabeçalho Host presente nas requisições dos clientes. Por exemplo, antes de acessar um site HTTPS hospedado em um servidor web com virtual hosting ativado, o navegador precisa estabelecer uma conexão SSL com o servidor e solicitar o certificado necessário. No entanto, o servidor não consegue identificar qual domínio está sendo acessado e, portanto, não consegue retornar o certificado correto.
O SNI é uma extensão SSL/TLS desenvolvida para resolver esse problema. Antes de estabelecer a conexão SSL com o servidor, o navegador envia o hostname que especifica o domínio a ser acessado. Com isso, o servidor identifica e retorna o certificado correspondente ao domínio.
A maioria dos sistemas operacionais e navegadores oferece suporte a SNI. O OpenSSL 0.9.8 inclui suporte nativo a SNI, e as versões mais recentes de servidores NGINX também são compatíveis.
Descrição do problema
Se o seu site apresentar exceções de acesso HTTPS após ser adicionado ao WAF, é possível que os clientes envolvidos não ofereçam suporte a SNI.
Quando um navegador sem suporte a SNI tenta acessar um site protegido pelo WAF, o WAF não consegue identificar o domínio específico solicitado nem obter o certificado necessário para interagir com o navegador. Nessa situação, o WAF utiliza o certificado padrão para concluir o handshake com o navegador, que exibe o erro "Certificate not trusted".
Quando um cliente não oferece suporte a SNI, os seguintes problemas podem ocorrer:
Se o cliente for um aplicativo mobile em iOS, o acesso é bem-sucedido. Se o cliente for um aplicativo mobile em Android, o acesso falha.
Se o cliente for um navegador, o erro "Certificate not trusted" é exibido.
Solução
Capture os pacotes de handshake SSL no lado do cliente para verificar se ele oferece suporte a SNI. Neste exemplo, o navegador Chrome é usado para acessar o site oficial da Alibaba Cloud.
Se as informações de SNI estiverem presentes no pacote Client Hello, o cliente oferece suporte a SNI.
Caso contrário, o cliente não oferece suporte a SNI. Recomendações:
Atualize o navegador ou utilize a versão mais recente disponível, como Chrome ou Firefox.
Em cenários de callback de terceiros, como callbacks do WeChat ou do 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 é compatível com SSL.
-
O SNI oferece suporte aos seguintes desktop browsers:
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 (em Windows Vista/Server 2008 e versões posteriores, excluindo qualquer versão do IE no Windows XP)
Konqueror 4.7 e versões posteriores
Opera 8 e versões posteriores
Safari 3.0 em Windows Vista/Server 2008 e versões posteriores, ou Mac OS X 10.5.6 e versões posteriores
-
O SNI oferece suporte às seguintes libraries:
GNU TLS
Java 7 e versões posteriores (somente 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 (flags necessárias)
QT 4.8 e versões posteriores
Python 3, Python 2.7.9 e versões posteriores
-
O SNI oferece suporte aos seguintes mobile browsers:
Android Browser no Android 3.0 Honeycomb e versões posteriores
iOS Safari no iOS 4 e versões posteriores
Windows Phone 7 e versões posteriores
-
O SNI oferece suporte aos seguintes servers:
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
-
O SNI oferece suporte às seguintes command line interfaces:
cURL 7.18.1 e versões posteriores
wget 1,14 e versões posteriores