如何检测服务器是否正在使用SPDY协议

11

有没有办法检测远程网站是否支持SPDY以及它的版本?

我需要一个可以在命令行中使用的类似于bash脚本的东西。

尝试使用curl发送自定义User-Agent标头,但是无法获取任何有助于我的响应标头。

我的想法是能够获取任何域的SPDY:true/false Version:3.1/3.0 ...。


你打算自己写一个程序来完成这个任务,还是想让别人为你编写这个程序? - Kevin Panko
我原本希望有一些现成的东西可以在 Bash 脚本中使用。 - Jim
2个回答

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
我的服务器使用openssl v1.0.1,这个命令很有帮助。非常感谢! - VitDuck

6
SPDY协议的协商是在初始TLS握手期间完成的。
目前有两种协商协议的方法:较旧的称为NPN(https://datatracker.ietf.org/doc/html/draft-agl-tls-nextprotoneg-04)。 在ClientHello TLS消息中,客户端发送带有ID 0x3374的NPN扩展。服务器回复一个ServerHello TLS消息,该消息还包含了服务器支持的协议列表,也在一个NPN扩展中。 然后客户端选择协议并将其加密后的选择发送到服务器。
新方法是为HTTP 2.0设计的,称为ALPN(https://datatracker.ietf.org/doc/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(用于客户端和服务器)Jetty

其他服务器(如Nginx或Apache)使用补丁支持NPN和ALPN(因为HTTP 2.0将需要这些)。

NPN最终将会消失;Google的Adam Langley已经声明,NPN将被ALPN取代。

你建议使用Wireshark来检查SPDY吗?有没有自动化这个过程的方法? - Jim
Wireshark肯定是一个选项。可编程选项是找到一个API,允许您设置/检查TLS扩展。我知道Java目前没有提供这样的API,但其他语言/平台可能会有。Jetty项目在Java中具有NPN和ALPN的API,但它们不能同时使用。通过使用Jetty API,可以相当容易地检测SPDY支持(这就是Jetty SPDY客户端所做的)。 - sbordet
我认为这个被错误地踩的答案比被接受的那个更好。+1 - cnicutar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接