2014-05-19 61 views
11

任何方式來檢測遠程網站是否支持SPDY和它是什麼版本?如何檢測服務器是否使用SPDY

我可以在命令行中使用一些東西,如bash腳本。

試以自定義的User-Agent頭,捲曲,但不能得到任何響應頭,這將有助於我的。

這個想法是能夠得到SPDY:true/false版本:3.1/3.0 ...爲任何域。

+0

你要編寫一個程序來做到這一點,或者你想要這個程序爲你寫? –

+0

我希望有一些東西可以用在bash腳本中。 – Jim

回答

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

如果您使用的是openssl 0.9.8,此命令將不起作用。如果您在Mac上,則可以使用brew更新openssl:http://apple.stackexchange.com/a/126832/78754 – jdorfman

7

SPDY協議協商在初始TLS握手期間發生。

目前有兩種方式進行談判的協議:舊的一個被稱爲NPN(http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-04)。 在ClientHello TLS消息中,客戶端發送ID爲0x3374的NPN擴展。服務器回覆一個ServerHello TLS消息,該消息也包含NPN擴展中服務器支持的協議列表。 客戶端然後選擇協議並將其加密選擇發送到服務器。

較新的方法,已被設計爲HTTP 2.0,並且被稱爲ALPN(http://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-05)。 ClientHello TLS消息包含ID爲0x10的ALPN擴展。 這次,客戶端發送支持的協議列表,並且服務器回覆一個包含服務器選擇的協議的ServerHello TLS消息,同樣在ALPN擴展中。

在NPN和ALPN擴展中,協議列表都以字符串形式發送,如http/1.1spdy/3

一旦該協議已被選定,TLS握手繼續,然後雙方將立即開始說話,他們選擇的協議。因此

要知道協議的談判的唯一方式是使用TLS,並有一個客戶端暴露了協議協商擴展。 每個客戶端都以特定的方式執行該操作,但據我所知,尚不支持bash腳本。

HAProxy例如支持NPN和ALPN(http://cbonte.github.io/haproxy-dconv/configuration-1.5.html)和Jetty 9.2也支持NPN和ALPN(均適用於客戶端和服務器)。

像Nginx的或Apache其他服務器具有與ALPN貼片(因爲其將通過HTTP 2.0需要反正)爲NPN支持。

NPN最終會消失;谷歌的Adam Langley has stated NPN將被棄用,以支持ALPN。

+0

所以你推薦使用wireshark檢查SPDY?任何方法來自動化這個過程? – Jim

+0

Wireshark無疑是一種選擇。可編程選項旨在查找允許您設置/檢查TLS擴展的API。我知道Java不提供一個(但),但其他語言/平臺可能。 Jetty項目在Java中具有用於NPN和ALPN的API,但它們不能一起使用。通過使用Jetty API,檢測SPDY支持相當容易(Jetty SPDY客戶端就是這麼做的)。 – sbordet

+0

我認爲這個錯誤的downvoted答案比接受的答案要好。+1 – cnicutar

相關問題