Qual é a diferença entre os certificados SSL SAN e SNI?

21

Alguém poderia me explicar a diferença entre esses certificados de uma maneira simplificada? Eu li alguns artigos, mas parece que eles fazem o mesmo trabalho, ou seja, criptografar muitos domínios com um certificado.

AFA Med
fonte
11
Bem, primeiro, não existe um certificado SSL "SNI".
Michael Hampton

Respostas:

36

SAN (nome alternativo da entidade) faz parte da especificação do certificado X509 , na qual o certificado possui um campo com uma lista de nomes alternativos que também são válidos para a entidade (além do nome comum / CN único). Esse campo e os nomes curinga são essencialmente as duas maneiras de usar um certificado para vários nomes.

SNI (Server Name Indication) é uma extensão de protocolo TLS que é uma espécie de protocolo TLS equivalente ao cabeçalho do host HTTP. Quando um cliente envia isso, ele permite que o servidor escolha o certificado apropriado para apresentar ao cliente sem ter a limitação de usar endereços IP separados no lado do servidor (como o cabeçalho do host HTTP é muito usado para HTTP simples).

Observe que o SNI não é algo refletido no certificado e, na verdade, alcança o oposto do que a pergunta pede; simplifica ter muitos certificados, não usar um certificado para muitas coisas.

Por outro lado, depende muito da situação de qual caminho é realmente preferível. Como exemplo, o que a pergunta pede quase certamente não é o que você realmente deseja se precisar de certificados para entidades diferentes.

Håkan Lindqvist
fonte
2
Vale a pena notar que a CN foi preterida por um longo tempo, se um nome estiver na CN, mas não na SAN (ou se um certificado não tiver um campo SAN), muitos clientes ficarão bravos com você.
coderanger
1
@coderanger Se houver um campo SAN, o campo CN será ignorado pela maioria dos clientes. Se não houver um campo SAN, o campo CN funcionará com a maioria dos clientes (e se eles ficarem bravos comigo, não será exibido).
kubanczyk
1
Eles estão te julgando silenciosamente.
Womble
O SNI é algo semelhante aos hosts virtuais em que um servidor com um endereço IP, digamos, contém vários hosts definidos na configuração HTTP? (algum tipo de multiplexação: usando um IP para vários certificados em vez de cada certificado com um IP diferente, onde o IPv4 é um recurso escasso atualmente)?
Fernando Gabrieli
1
@FernandoGabrieli Sim, ele habilita o mesmo tipo de configuração baseada em nome no nível TLS.
Håkan Lindqvist
14

SAN significa Subject Alternative Name , e é uma propriedade de certificado x509, e SNI é um recurso que o cliente SSL / TLS pode suportar, portanto, uma entidade totalmente diferente.

Usando um certificado com SAN, você pode hospedar vários sites habilitados para HTTPS em um endereço IP, mesmo que o cliente não suporte o SNI . Neste caso você mantenha um certificado para todos os seus sites, e tal certificado deve conter todos os nomes de site ( ServerNameS ou ServerAliases nas coordenadas apache, ou server_nameno nginx) como é SANs . Esse é um subconjunto de uma abordagem herdada, que estendeu o "um site habilitado para HTTPS em cada endereço IP separado". Atualmente, apenas grandes CDNs permanecem na SAN .

Usando o SNI, você também pode hospedar vários sites habilitados para HTTPS em um IP, possui um certificado x509 separado para cada site e nenhum deles menciona outros nomes de sites em sua propriedade SAN , mas os clientes TLS (por exemplo, navegadores e clientes de console como wgetou curl) deve suportar SNI . Essa é uma abordagem moderna, já que o último sistema operacional que não oferece suporte ao SNI imediato foi o Windows XP com o IE 6.x, se bem me lembro. Atualmente, você pode ver a propriedade da SAN se comprar o certificado curinga - por exemplo, um certificado para esse *.foobar.comconterá um Nome Comum de *.foobar.come uma SAN de foobar.com.

drookie
fonte
1
Tecnicamente, não acredito que um cliente SSL possa suportar SNI (que eu saiba, é uma extensão TLS que nunca apareceu em SSL).
Håkan Lindqvist
3
A SAN e a SNI requerem suporte ao cliente. No entanto, como a SAN existe há muito mais tempo, é mais amplamente suportada.
kasperd
4

Isso combina duas partes do processo de certificado.

Uma SAN é um nome alternativo do assunto. É uma maneira de criar um certificado para vários domínios. Você simplesmente adiciona os outros domínios para os quais deseja um certificado ao campo SAN no certificado. O navegador também aceitará a validade desses domínios.

SNI é a indicação do nome do servidor e faz parte do SSL. Ele permite que você hospede vários sites SSL em um único IP, porque o nome do servidor desejado é enviado com o handshake SSL e o servidor pode escolher o certificado correto para a resposta.

Christopher Perrin
fonte
0

Aqui está uma resposta legível (possivelmente) mais humana:

O SNI é conduzido no lado do cliente e diz à pilha TLS "Quero falar com um servidor cujo nome é [Servidor X]". O servidor vê essa string [Server X] e responde com um certificado apropriado. Um exemplo prático é quando um único servidor precisa servir o tráfego para vários domínios. Também é útil se o cliente usou um IP (para evitar atrasos na pesquisa de DNS), mas o certificado CN não menciona o IP.

SAN é uma lista de "Também conhecido como" nos certificados. Dessa forma, o servidor pode usar um único certificado para muitos nomes. Pode-se adicionar muitos domínios ao mesmo certificado e até uma lista de IPs.

Como você pode ver, as coisas se sobrepõem. Escolher entre um ou ambos depende de onde se tem controle. Alguns clientes podem não reconhecer nomes na SAN e a única maneira de resolver isso é fornecendo o certificado apropriado com base no SNI. Existem cenários em que servidor fornece API para um único certificado ou o cliente não envia SNI. Para esses casos, a SAN é a única saída.

Minha empresa faz uso de ambos. Eles fornecem flexibilidade e facilitam a compatibilidade com versões anteriores e posteriores.

Igor Gatis
fonte