Como posso detectar se um servidor está usando SNI para HTTPS?

35

Estou procurando uma maneira simples de saber se um servidor está usando a extensão SSL de Indicação do Nome do Servidor para seu certificado HTTPS em um site. Um método que usa um navegador ou uma linha de comando Unix é bom.

Obrigado!

    
por spookylukey 08.05.2013 / 23:04

3 respostas

19

O SNI é iniciado pelo cliente, então você precisa de um cliente que o suporte. A menos que você esteja no Windows XP, o seu navegador fará. Se o seu cliente permitir que você depure as conexões SSL corretamente (infelizmente, mesmo os comandos CLI gnutls / openssl não), você pode ver se o servidor envia de volta um campo server_name no hello estendido. Observe que a ausência desse campo significa apenas que o servidor não usou o server_name no cliente hello para ajudar a escolher um certificado, não que ele não o suporte.

Então, na prática, o teste mais fácil é simplesmente tentar se conectar. Para isso, você precisa saber dois nomes que resolvem o mesmo IP, para o qual uma conexão ssl pode ser feita. O https é o mais fácil possível, basta procurar os dois nomes e ver se recebeu o certificado correto.

Existem três resultados:

  • Você obtém um certificado curinga (ou um com um subjectAltName) que abrange os dois nomes: você não aprende nada
  • Você obtém o certificado errado para pelo menos um deles: o servidor não suporta SNI ou foi configurado incorretamente
  • Você obtém dois certificados diferentes, ambos para o nome correto: o SNI é suportado e está configurado corretamente.

Um teste um pouco mais complicado, que dará mais informações, é ter o wireshark aberto e capturado durante a navegação. Você pode então encontrar os pacotes relevantes filtrando o arquivo ssl.handshake. As capturas de tela abaixo são um exemplo de um par hello / servidor hello do cliente em que o SNI é suportado:

Novamente, é claro que a ausência de um campo server_name no servidor hello não indica que o SNI não é suportado. Apenas que o server_name fornecido pelo cliente não foi usado para decidir qual certificado usar.

    
por 09.05.2013 / 11:37
18

O único liner que você provavelmente está procurando para detectar a presença de um cabeçalho de extensão de Indicação de Nome de Servidor SSL / TLS é:

openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"

em que www.SERVERNAME.com é o valor SNI que você está testando e www.YOURSERVER.com é o nome de domínio ou endereço IP do servidor compatível com TLS que você está testando.

A linha de comando usa openssl s_client (consulte s_client (1) ) para se conectar ao servidor em www.YOURSERVER.com na porta 443 . A opção -tlsextdebug ativa a saída de depuração da extensão TLS. A opção -servername informa ao programa s_client para passar www.SERVERNAME.com como o valor do campo SNI no pacote ClientHello durante o handshake de TLS.

Por fim, 2>/dev/null simplesmente oculta a saída stderr (que pode ser ruidosa) e o | grep "server name" pipeline filtra stdout para exibir a extensão TLS chamada "nome do servidor" na saída de depuração da extensão TLS s_client .

Se você vir uma linha de saída, como

TLS server extension "server name" (id=0), len=0

o servidor está retornando as informações do cabeçalho SNI em sua resposta ServerHello. Se você não o fizer, então é possível que o servidor não suporte SNI ou não tenha sido configurado para retornar informações SNI, dado o nome que você está pedindo. Nesse caso, verifique se você está usando um nome de domínio na opção -servername que o servidor deve responder com informações sobre o SNI.

    
por 01.06.2016 / 22:34
-3

Você pode usar openssl para buscar e consultar o certificado.

  • obtenha o certificado com openssl s_client -connect
  • analisa o certificado com openssl x509
  • grep para encontrar o "DNS:" info

openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:

% openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = BM, O = QuoVadis Limited, CN = QuoVadis Global SSL ICA G2
verify return:1
depth=0 C = CH, ST = Zuerich, L = Zuerich, O = Kaspar Brand, CN = alice.sni.velox.ch
verify return:1
                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

A última linha mostra todas as entradas SNI presentes no certificado:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch
    
por 15.05.2015 / 19:52