HTTPS的工作流程
使用HTTPS协议工作时,服务端和客户端的信息传输都会进行加密,所以传输的数据都是加密后的数据。HTTPS的工作流程如下:
1、客户端使用HTTPS的URL访问Web服务器,要求与Web服务器建立SSL连接。
2、Web服务器收到客户端的请求后,会将网站包含有公钥的证书信息传送一份给客户端。
3、客户端浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
4、客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
5、Web服务器利用自己的私钥解密出会话密钥。
6、Web服务器利用会话密钥加密与客户端之间的通信。
HTTPS数据包的捕获
由于HTTPS是建立在TCP协议之上的,所以我们在捕获之前,可以设置筛选器为TCP。开始捕获后,可以通过登录QQ邮箱的方式,捕获到含有HTTPS协议的数据包。如下图所示(Lab15-1.pcapng):
在这个界面的Info列中,可以看到这些数据包都是使用HTTPS协议传输的。而在Protocol列中,可以看到SSL、TCP以及TLSv1.1等协议。其中的TLS(Transport Layer Security)其实是SSL的升级版,是为网络通信提供安全及数据完整性的一种安全协议。二者都是在传输层对网络连接进行加密的。
为了便于进一步的分析,这里我们依旧可以采用前几次课中说过的,通过着色后提取数据包的方式,将我们需要的数据包提取出来,这里不再赘述。
HTTPS数据包的分析
这里我们打开Lab15-1-https.pcapng这个实验文件,也就是经过提取后的文件进行分析:
首先可以发现1到3号数据包是TCP连接建立时的三次握手的过程。接下来从第4个数据包开始,其实就是SSL握手过程中所产生的数据包,也就是使用HTTPS协议加密的信息。
对于第4个数据包,包含有客户端向服务器发送的Client Hello信息,以便开始一个新的加密会话连接。展开SSL区段,可以看到客户端支持的TLS的版本(Version);生成的随机数(Random,以便用于生成对话密钥);Cipher Suites的值是15,说明支持15种加密算法;支持的压缩方式(Compression)以及一些扩展(Extension)等:
当服务器收到客户端的请求后,就会向客户端发出响应,也就是Server Hello。对于我们这个捕获文件而言,第6个数据包就是服务器发送给客户端的确认信息,告诉客户端请求已经收到:
展开SSL数据段,可以看到服务器支持的TLS版本为1.1。也可以看到服务器生成的随机数,用于生成对话密钥。下面还有加密套件信息,这里的加密套件表示使用RSA公钥算法来验证证书以及交换密钥,用AES加密算法对数据进行加密,使用SHA算法来校验消息内容。
客户端收到服务器的响应后,首先验证服务器的证书。如果证书不是由可信任的机构颁发的,或者证书中的域名与实际域名不一致,或者证书已过期,就会向访问者显示一个警告,由访问者选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送一些信息,包括用服务器公钥加密的随机数、编码改变通知和客户端握手结束通知等。服务器发送给客户端的数据包,如下图所示:
在Certificate区段中,保存有证书的详细信息。可以看到请求的网站、组织名、地区名、省名以及国家等的信息。紧接下来的signedCertificate是签名证书信息。“签名”的作用就在于,客户端(浏览器)在确定是否要信任一个网站时,就是通过证书判断的。所以每个证书上必须要有一份“签名”。最后一行Length的值为0,表示告诉客户端“Hello”过程已经完成,也就意味着服务器将不验证客户端的证书。
在客户端收到并验证服务器响应的证书后,将会把生成的密钥传给服务器,如下图所示:
在Client Key Exchange中,我们可以看到TLS的类型、版本、长度、握手协议、握手类型、长度、密钥交换算法客户端参数、公钥长度以及加密公钥等信息。而在其它的两个记录中,也有着类似的结构。
经过以上几个阶段,整个握手过程也就结束了。接下来客户端与服务器进入加密通信的阶段,就完全是使用普通的HTTP协议,但是会使用会话密钥来加密内容。用户可以发送通过TLS层使用RC4加密的HTTP的消息,也可以解密服务端发送来的由RC4加密的消息。此外还会通过哈希算法来验证消息是否被篡改。
在应用层,客户端向服务器发送的信息为:
可见,发送的数据都经过了加密处理。服务器响应客户端的信息,如下图所示:
可以看到,这也是使用了SSL进行加密。
HTTPS数据包的解密
HTTPS的数据包并不是绝对安全的,在一定的条件下也可以实现解密的操作,这里我们打开Lab15-2.cap实验文件:
可以看到,这里的数据包使用了SSLv3进行加密。为了实现解密,我们需要Lab15-2.key文件。为了便于寻找,这里我将这个文件放在了我的电脑中的C盘根目录下。之后在Wireshark中选择菜单栏的“Edit”->”Preferences”->”Protocols”->”SSL”->”RSA keys list”->”Edit”->”New”,之后进行如下填写:
之后点击OK,就可以实现解码了:
现在已经可以看到GET方法等信息。尽管我们对捕获文件进行了解码操作,但是并不意味着HTTPS不安全。因为解码所需要使用的密钥只能在服务器导出,不同的服务器的情况并不一样,因此想要破解HTTPS的数据包,是需要满足很多的条件的。