摘要
通过对SSL握手协议的分析,得知在SSL双向认证握手过程中,客户端需要出示客户端证书以供服务器验证,利用sniffer技术截获网络通信过程中的TCP/IP数据包,通过对TCP/IP数据包的解析,获得客户端证书公钥。
关键字:sniffer,SSL 握手协议,TCP/IP, 证书公钥
相关工具:
Ethereal:网络抓包工具,Ethereal是免费的网络协议检测程序,支持Unix,Windows。让您经由程序抓取运行的网站的相关资讯,包括每一封包流向及其内容、资讯。可依操作系统语系看出,方便查看、监控TCP session动态等等
Ethereal0.99.0下载地址:http://www.newhua.com/soft/3906.htm
JPCAP开源组件: JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共 的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。
JPCAP下载地址:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/download.html
SSL协议分析
参考文档:http://blog.chinaunix.net/u/6258/showart_156636.html
SSL的握手协议包括如下几个步骤:
Ø 交换Hello信息,协商算法、交换随机数、检查会话重组
Ø 交换允许客户端和服务器端协商预主秘密的必要的密码参数
Ø 交换证书和密码信息,使得客户端和服务器端进行认证
Ø 从预主秘密和给定随机数产生主秘密
Ø 为记录层提供安全参数
Ø 允许客户端和服务器端检测实体是否计算出相同的安全参数,握手是否在没有攻击的情况下发生的
Client Server
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
图一:完全握手的信息流程
*表示并不一定发送的可选的或者依情况而定的信息
红色部分为服务器为双向认证时,服务器会向客户端发送CertificateRequet请求,要求客户端出示证书,客户端接受到CertificateRequet请求后,弹出证书选择列表,用户选择客户端使用证书,点击确定后向服务器发送Certificate,我们所要截获的客户端出示的证书公钥包含在此请求中。
SSL记录层协议数据包结构定义如下:
enum {
change_cipher_spec(20), alert(21), handshake(22),
application_data(23), (255)