Come posso rilevare se un server utilizza SNI per HTTPS?


41

Sto cercando un modo semplice per sapere se un server utilizza l'estensione SSL Indicazione nome server per il suo certificato HTTPS su un sito Web. Un metodo che utilizza un browser o la riga di comando Unix va bene.

Grazie!

Risposte:


20

SNI viene avviato dal client, quindi è necessario un client che lo supporti. A meno che tu non sia su Windows XP, il tuo browser lo farà. Se il tuo client ti consente di eseguire correttamente il debug delle connessioni SSL (purtroppo, anche i comandi CLI gnutls / openssl non lo fanno), puoi vedere se il server rispedisce un campo nome_server nel ciao esteso. Si noti che l'assenza di questo campo significa solo che il server non ha utilizzato il nome_server nel ciao del client per aiutare a scegliere un certificato, non che non lo supporti.

Quindi, in pratica, il test più semplice è semplicemente provare a connettersi. Per questo è necessario conoscere due nomi che si risolvono nello stesso IP, a cui è possibile stabilire una connessione ssl. https è più semplice in quanto puoi semplicemente passare a entrambi i nomi e vedere se ti viene presentato il certificato corretto.

Ci sono tre risultati:

  • Ottieni un certificato jolly (o uno con un subjectAltName) che copre entrambi i nomi: non impari nulla
  • Ottieni almeno un certificato errato per almeno uno di essi: il server non supporta SNI o è stato configurato in modo errato
  • Ottieni due certificati diversi, entrambi per il nome corretto: SNI è supportato e configurato correttamente.

Un test leggermente più complicato che produrrà più informazioni è di aprire e catturare i fili durante la navigazione. È quindi possibile trovare i pacchetti pertinenti filtrando per ssl.handshake. Le schermate seguenti sono un esempio di una coppia hello client / ciao server in cui è supportato SNI:

Ciao cliente Ciao server

Anche in questo caso, ovviamente l'assenza di un campo nome_server nel ciao server non indica che SNI non è supportato. Solo che il nome_server fornito dal client non è stato usato per decidere quale certificato usare.


9
Dennis - non sono d'accordo openssl. Sono disponibili alcuni dettagli: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443durante il test SSL Qualys vengono fornite alcune indicazioni sull'utilizzo di SNI .
Deer Hunter

Ah, l'ho perso nella manpage. Grazie per l'aggiunta.
Dennis Kaarsemaker,

26

L'unico liner che probabilmente stai cercando per rilevare la presenza di un'intestazione di estensione di indicazione del nome server SSL / TLS è:

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

dove si www.SERVERNAME.comtrova il valore SNI che stai testando ed www.YOURSERVER.comè il nome di dominio o l'indirizzo IP del server TLS che stai testando.

La riga di comando usa openssl's s_client(vedi s_client (1) ) per connettersi al server www.YOURSERVER.comsulla porta 443. L' -tlsextdebugopzione attiva l'output di debug dell'estensione TLS. L' -servernameopzione indica al s_clientprogramma di passare www.SERVERNAME.comcome valore del campo SNI nel pacchetto ClientHello durante l'handshake TLS.

Infine, 2>/dev/nullnasconde semplicemente l'output di stderr (che può essere rumoroso) e la | grep "server name"pipeline filtra stdout per visualizzare l'estensione TLS denominata "nome server" s_clientnell'output di debug dell'estensione TLS.

Se vedi una linea di output come

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

quindi il server restituisce le informazioni dell'intestazione SNI nella sua risposta ServerHello. In caso contrario, è possibile che il server non supporti SNI o che non sia stato configurato per restituire informazioni SNI dato il nome richiesto. In questo caso, ricontrolla che stai utilizzando un nome di dominio -servernamenell'opzione su cui il server dovrebbe rispondere con le informazioni SNI su.


1
L'output è lo stesso, sia che io usi correttamente -servernameo meno. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(E lo stesso output se corrispondono.) Come si verifica che non corrisponda a un host sul server dall'output?
bshea,

1
@bshea Devi passare -msgoltre ai parametri sopra e grep per "Alert". Se -servernameè sbagliato otterrai qualcosa di simile TLS 1.2 Alert ... warning unrecognized_namedal server. @Meitar Penso che se lo aggiungi alla risposta sarà utile per altre persone.
Viktor Nonov,

@ViktorNonov Lo -msgswitch aggiunge semplicemente un hexdump di messaggi del protocollo TLS. Non è necessario osservare un errore di handshake TLS, quindi sarebbe errato aggiungere a questa risposta. Inoltre, errori di handshake TLS come questo vengono stampati su STDOUT, il che significherebbe che 2>/dev/nullsarebbe necessario rimuoverli dalla risposta per poter essere elaborati grepin primo luogo. Ciò che @bshea sta effettivamente chiedendo è "Come posso rilevare gli errori TLS?" che è una domanda completamente diversa dalla domanda "Questo server utilizza la funzionalità SNI del protocollo TLS?" che è l'argomento qui.
Meitar,

@Meitar, non sono riuscito a trovare un altro modo per osservare i messaggi di handshake TLS. Inoltre, anche se reindirizzo STDERRa un file di testo, non visualizzo quell'errore lì. Senza non -msgavrei potuto trovare un'altra opzione che mostra i messaggi di handshake. (usando openssl 1.0.2q). Finché la rilevanza per la risposta potresti avere ragione.
Viktor Nonov,

-2

È possibile utilizzare opensslper recuperare e interrogare il certificato.

  • recupera il certificato con openssl s_client -connect
  • analizzare il certificato con openssl x509
  • grep per trovare le informazioni "DNS:"

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

L'ultima riga mostra tutte le voci SNI presenti nel certificato:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

Cosa sto cercando in quell'output? Il fatto che siano presenti più domini?
spookylukey,

Le DNS:... voci sull'ultima riga mostrano tutti i nomi SNI validi nel certificato.
spazm

4
Le SAN in un certificato e il supporto SNI su un server sono cose diverse, l'uso di SAN per il virtualhosting HTTPS è una sorta di hack che precede SNI. Per SNI non è necessario un certificato con SAN poiché il server è in grado di selezionare un singolo certificato che corrisponde alle aspettative di denominazione dei client.
signor spuratic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.