2014-05-19 11 views
11

Un modo per rilevare se un sito Web remoto supporta SPDY e quale versione è?Come rilevare se un server utilizza SPDY

Qualcosa che posso usare dalla riga di comando come uno script di bash.

Provato a inviare intestazioni personalizzate di User-Agent con arricciatura ma non è possibile ottenere alcun tipo di intestazione di risposta che possa aiutarmi.

L'idea è di essere in grado di ottenere SPDY: true/false Versione: 3.1/3.0 ... per qualsiasi dominio.

+0

Avete intenzione di scrivere un programma per farlo o volete che questo programma sia scritto per voi? –

+0

Speravo che ci fosse qualcosa di pronto là fuori che potrei usare in uno script bash. – Jim

risposta

18
openssl s_client -connect google.com:443 -nextprotoneg '' 
CONNECTED(00000003) 
Protocols advertised by server: spdy/3.1, spdy/3, http/1.1 
+7

Questo comando non funzionerà se si sta usando openssl 0.9.8. Se sei su un Mac puoi aggiornare openssl con brew: http://apple.stackexchange.com/a/126832/78754 – jdorfman

7

La negoziazione del protocollo SPDY si verifica durante l'iniziale handshake TLS.

Attualmente esistono due modi per negoziare il protocollo: il precedente è denominato NPN (http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-04). Nel messaggio TLS ClientHello il client invia l'estensione NPN con ID 0x3374. Il server risponde con un messaggio ServerHello TLS che contiene anche l'elenco di protocolli supportati dal server anche in un'estensione NPN. Il client sceglie quindi il protocollo e invia la sua scelta, crittografata, al server.

Il nuovo metodo è stato progettato per HTTP 2.0 e si chiama ALPN (http://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-05). Il messaggio TLS ClientHello contiene l'estensione ALPN con ID 0x10. Il client, questa volta, invia l'elenco dei protocolli supportati e il server risponde con un messaggio ServerHello TLS che contiene il protocollo scelto dal server, anche in un'estensione ALPN.

In entrambe le estensioni NPN e ALPN l'elenco di protocolli viene inviato come stringhe come http/1.1 o spdy/3.

Una volta che il protocollo è stato scelto, l'handshake TLS continua e quindi entrambe le parti inizieranno a parlare immediatamente il protocollo che hanno scelto.

L'unico modo per essere a conoscenza della negoziazione del protocollo è quindi utilizzare TLS e disporre di un client che esponga le estensioni di negoziazione del protocollo. Ogni client lo fa in un modo specifico, ma per quanto ne so non esiste ancora il supporto per gli script di bash.

HAProxy, ad esempio, supporta sia NPN che ALPN (http://cbonte.github.io/haproxy-dconv/configuration-1.5.html) e Jetty 9.2 ha anche il supporto per NPN e ALPN (sia per client sia per server).

Altri server come Nginx o Apache supportano NPN con patch per ALPN (poiché sarà comunque necessario da HTTP 2.0).

NPN alla fine svanirà; Google Adam Langley has stated che NPN sarà deprecato a favore di ALPN.

+0

Quindi si consiglia di utilizzare wireshark per verificare la presenza di SPDY? Un modo per automatizzare questo processo? – Jim

+0

Wireshark è certamente un'opzione. L'opzione programmabile è trovare un'API che ti permetta di impostare/ispezionare le estensioni TLS. So che Java non ne fornisce uno (ancora), ma altre lingue/piattaforme potrebbero. Il progetto Jetty ha API per NPN e ALPN in Java, ma non possono essere utilizzati insieme. Utilizzando le API Jetty sarebbe abbastanza facile rilevare il supporto SPDY (questo è ciò che fa il client Jetty SPDY). – sbordet

+0

Penso che questa risposta erroneamente downvoted sia migliore di quella accettata.+1 – cnicutar