O que é SNI? Como funciona a Indicação de Nome do Servidor do TLS

SNI, ou Indicação de Nome do Servidor, é um acréscimo ao protocolo de criptografia TLS que permite a um dispositivo cliente especificar o nome de domínio que está tentando alcançar na primeira etapa do handshake TLS, evitando erros de incompatibilidade de nome comum.

Objetivos de aprendizado

Após ler este artigo, você será capaz de:

  • Explicar o que é um nome de host virtual
  • Entender porque um servidor pode fornecer o certificado SSL errado
  • Saber como o SNI corrige este problema

Conteúdo relacionado


Quer saber mais?

Inscreva-se para receber artigos de aprendizado sobre segurança da Cloudflare.

Consulte a política de privacidade da Cloudflare para saber como coletamos e processamos seus dados pessoais.

Copiar o link do artigo

O que é SNI (Indicação de Nome do Servidor)?

A SNI é como enviar um pacote para um prédio de apartamentos em vez de para uma casa. Ao enviar algo para a casa de alguém, apenas o endereço da rua é suficiente para que o pacote chegue à pessoa certa. Mas quando um pacote vai para um prédio de apartamentos, ele precisa do número do apartamento além do endereço; caso contrário, o pacote pode não ir para a pessoa certa ou pode não ser entregue.

Muitos servidores web são mais como prédios de apartamentos do que casas: eles hospedam vários nomes de domínio e, portanto, o endereço de IP por si só não é suficiente para indicar qual domínio um usuário está tentando acessar. Isso pode fazer com que o servidor mostre o certificado SSL incorreto, o que impede ou encerra uma conexão HTTPS – assim como um pacote não pode ser entregue em um endereço se a pessoa correta não assinar por ele .

Quando vários sites são hospedados em um servidor e compartilham um único endereço de IP, e cada site tem seu próprio certificado SSL, o servidor pode não saber qual certificado SSL mostrar quando um dispositivo cliente tenta se conectar com segurança a um dos sites. Isso ocorre porque o handshake SSL/TLS ocorre antes que o dispositivo cliente indique por HTTP a qual site ele está se conectando.

A Indicação de Nome do Servidor (SNI) foi projetada para resolver esse problema. A SNI é uma extensão para o protocolo TLS (anteriormente conhecido como protocolo SSL), que é usado em HTTPS. Ele está incluído no processo de handshake TLS/SSL para garantir que os dispositivos clientes possam ver o certificado SSL correto para o site que estão tentando acessar. A extensão permite especificar o hostname, ou nome de domínio, do site durante o handshake TLS, em vez de quando a conexão HTTP abre após o handshake.

Simplificando, a SNI possibilita que um dispositivo de usuário abra uma conexão segura com https://www.example.com mesmo que esse site esteja hospedado no mesmo local (mesmo endereço de IP) que https://www.something.com, https://www.another-website.com e https://www.example.io.

A SNI evita o que é conhecido como "erro de incompatibilidade de nome comum": quando um dispositivo cliente (usuário) atinge o endereço de IP correto para um site, mas o nome no certificado SSL não corresponde ao nome do site. Muitas vezes, esse tipo de erro resulta em uma mensagem de erro "Sua conexão não é privada" no navegador do usuário.

A SNI foi adicionada como uma extensão ao TLS/SSL em 2003; originalmente não fazia parte do protocolo. Quase todos os navegadores, sistemas operacionais e servidores da web são compatíveis com ela, com exceção de alguns dos navegadores e sistemas operacionais mais antigos que ainda estão em uso.

O que é um nome de servidor?

Embora SNI signifique Indicação de Nome do Servidor, o que SNI realmente "indica" é o hostname de um site, ou nome de domínio, que pode ser separado do nome do servidor web que hospeda o domínio. Na verdade, é comum que vários domínios sejam hospedados em um servidor – nesse caso eles são chamados de hostnames virtuais.

Um nome de servidor é simplesmente o nome de um computador. Para servidores web, esse nome normalmente não é visível para os usuários finais, a menos que o servidor hospede apenas um domínio e o nome do servidor seja equivalente ao nome do domínio.

O que a extensão TLS SNI faz?

Muitas vezes, um servidor web é responsável por vários hostnames – ou nomes de domínio (que são os nomes dos sites legíveis por humanos). Cada nome de host terá seu próprio certificado SSL se os sites usarem HTTPS.

O problema é que todos esses hostnames em um servidor estão no mesmo endereço de IP. Isso não é um problema em HTTP, pois assim que uma conexão TCP for aberta, o cliente indicará qual site ele está tentando acessar em uma solicitação HTTP.

Mas em HTTPS, um handshake TLS ocorre primeiro, antes que a conversa HTTP possa começar (HTTPS ainda usa HTTP – apenas criptografa as mensagens HTTP). Sem a SNI, então, não há como o cliente indicar ao servidor com qual hostname está falando. Como resultado, o servidor pode produzir o certificado SSL para o hostname incorreto. Se o nome no certificado SSL não corresponder ao nome que o cliente está tentando acessar, o navegador do cliente retornará um erro e geralmente encerrará a conexão.

O SNI adiciona o nome de domínio ao processo de handshake TLS, para que o processo TLS alcance o nome de domínio correto e receba o certificado SSL correto, permitindo que o restante do handshake TLS prossiga normalmente.

Especificamente, a SNI inclui o hostname na mensagem de saudação do cliente ou na primeira etapa de um handshake TLS.

O que é um hostname? O que é um hostname virtual?

Um hostname é o nome de um dispositivo que se conecta a uma rede. No contexto da internet, um nome de domínio, ou o nome de um site, é um tipo de hostname. Ambos são separados do endereço de IP associado com o nome de domínio.

Um hostname virtual é um hostname que não possui seu próprio endereço de IP e está hospedado em um servidor junto com outros hostnames. É "virtual" no sentido de que não possui um servidor físico dedicado, assim como a realidade virtual existe apenas digitalmente, não no mundo físico.

O que acontece se o navegador de um usuário não for compatível com a SNI?

Nesse caso raro, o usuário provavelmente não conseguirá acessar determinados sites e o navegador do usuário retornará uma mensagem de erro como "Sua conexão não é privada".

A grande maioria dos navegadores e sistemas operacionais são compatíveis com a SNI. Apenas versões muito antigas do Internet Explorer, versões antigas do sistema operacional BlackBerry e outras versões de software desatualizadas não são compatíveis com a SNI.

Para saber mais sobre o protocolo TLS/SSL, certificados SSL e como o HTTPS funciona, consulte O que é um certificado SSL?