怎样手动获取我们所感兴趣网站的公钥证书?
一、通过抓包从网络协议数据流中获取
因为不管怎么说,在SSL协议的握手阶段,服务器必然会向客户端/浏览器发送自己的证书,所以我要详细说的这第一种获取证书的方法就是通过抓包从网络协议数据流中获取,这是一种通用性非常好的方法。以利用Wireshark 1.10(当然你若是有其他习惯的抓包工具也可以,只要支持SSL协议解析即可)获取account.test01.com的服务器证书例,方法如下:
(1)使用Wireshark 1.10把登录account.test01.com过程的HTTPS会话数据抓取下来(抓包的过程就不多说了,不会问度娘),为了后面定位数据包方便,抓包要尽量干净、完整;
(2)为了防止你还是不小心抓住了其他HTTPS会话的数据,你可以在Windows的命令提示符下用nslookup命令查询account.test01.com的IP地址,假如是192.168.1.57;
(3)使用 Ctrl+F 组合键打开查找对话框,By(查找类型)选择String,Search In(查找区域)选择Packet list,过滤条件写 Certificate ,设定完毕点 Find。如下图:
图1-1 查找对话框设置
(4)查看所查找到的数据包的源IP地址,是否为第(2)步中所获取的192.168.1.57,若是,则成功定位所需数据包;否则使用 Ctrl+N 组合键查看下一个符合查找条件的数据包,直到找到所需数据包为止;
(a)证书和Sever Hello消息分开发
(b)证书和Sever Hello消息在一个包里
图1-2 定位证书所在数据包的两种情况
(5)在上步定位好的数据包中找到证书链所在,如下图靛青色框所标注,
图1-3 证书和证书链在数据包中所处的位置
如上图,很多时候服务器发送的不止是自己的应用证书,而是会带上完整的证书链,其中第一个是本应用(即account.test01.com)的证书,图中黑色框标注。【应用证书的持有者,很多时候会使用通配符,例如本例中,account.test01.com所发送证书的持有者是*.test01.com,如果有类似于prox.test01.com,photo.test01.com之类的域名,他们也可以使用这个证书】
另外,图中灰色框标注了给该应用签名的子CA【即DigiCert High Assurance CA-3】的公钥证书,浅灰色框标注了上级CA【即DigiCert High Assurance EV Root CA】的公钥证书。
(6)Wireshark 提供了比较方便地方法从数据包中拷贝出证书,在上图中标注的证书所在位置右键,依次选择”copy”–>”Bytes”–>”Hex Stream”,获取16进制流形式的证书文件。如下图:
图1-4 证书信息的拷贝
(7)找一款支持16进制流拷贝的工具,比如010Editor,新建一个文件,把上一步得到的十六进制流复制到本文件(一定注意不能使用简单的文本复制,必须基于16进制流格式粘贴,010Editor中使用 Ctrl+Shift+V 组合键即可达到此效果),文件另存为account.test01.com.der。这就是我们要的证书,可以直接双击打开。
二、通过浏览器自带的证书复制/导出功能
我要介绍的第二种方法,有一定局限性,但是操作更为简单。我们平时用浏览器访问HTTPS网站时,如果你有细心观察的话,应该能看到浏览器地址栏会有个小锁(不同浏览器显示的位置不太一致),对于搜狗浏览器,如图2-1。
图2-1 搜狗浏览器访问https站点时的地址栏
点击这个小锁,弹出如下提示:
图2-2 “查看证书信息”
单击“查看证书信息”弹出证书,在“详细信息”选项卡下有个“复制到文件”按钮,如图2-3,点击后按照提示即可成功获取证书文件。
图2-3 证书复制
这个方法的局限性在于只适用于可用浏览器访问的网站,对于那些只用客户端(或者手机应用)访问的网站就无能为力,因为人家的客户端或应用往往都不提供证书复制或导出功能;即使是可用浏览器访问的网站,也只适用于直接使用https协议的网站(比如Gmail),不适用于临时从http跳转到https又跳回http的情况(比如12306)。