HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。


TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:

下面对这个4个阶段11个包进行详细分析

1.Client Hello报文

客户端将产个一个随机数A、并和浏览器能支持的TLS版本号(Extension字段)、以及浏览器能支持的加密方法发送给服务器。

2.Server Hello, Certificate, Server Key Exchange, Server Hello Done

我这边抓包是在服务器上使用tcpdump进行的,server hello的整个过程都在一个数据包中体现。我在查找https相关信息的时候,看到其他网站抓包显示sever hello的四个阶段分对应时四个独立的数据包,原因怀疑是nginx或者apache的特性,有待确认

2.1 Server Hello报文

Server Hello中包含了服务器从client hello中选出一组加密算法与HASH算法,TLS版本,一个服务器新生成的随机数B
这里可以看到server hello使用和选定的版本都是TLS1.2,选定的算法是TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

2.2 Certificate报文

Certificate部分含有两个数字证书,分别是网站的证书和一个中间证书(又称链证书)

中间证书主要解决安卓在某种情况下无法验证网站证书问题,详情查看文末参考文档
网站的数字证书中包含服务器的公钥(公钥的指纹在serialNumber字段)和证书的颁发机构的数字签名

1
2
3
4
//网站证书:
Certificate: 308204f9308203e1a003020102021203ca27d7faa2474679... (id-at-commonName=nbma.info)
//中间证书:
Certificate: 308204923082037aa00302010202100a0141420000015385... (id-at-commonName=Let's Encrypt Authority X3,id-at-organizationName=Let's Encrypt,id-at-countryName=US)

2.3 Server Key Exchange报文

这部分还没弄明白作用,前面client helloExtension字段中也有ECDH的参数

2.4 Server Hello Done报文

3.Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

浏览器获得网站证书之后浏览器要做以下工作:
验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示绿色的锁,否则会给出证书不受信的提示。

3.1 Client Key Exchange报文

如果证书受信任,或者是用户接受了不受信的证书,浏览器会发送一个Client Key Exchange的报文。该报文中包含一个客户端生成的新的随机数C,这个随机数被称为Pre-master key,并用网站证书中提供的公钥对该报文进行加密。

3.2 Change Cipher Spec

该报文提示服务器此后的报文将使用Pre-master key进行加密

3.3 Encrypted Handshake Message

该报文包含连接至今所有报文的校验值,并使用Pre-master key对消息进行加密。

4.New Seesion Ticket, Change Cipher Spec, Encrypted Handshake Message
网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出Pre-master key,使用Pre-master key解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段消息,发送给浏览器。

4.1 New Seesion Ticket

服务器跟据客户端发送的信息,生成一个seesion ticket。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的”对话密钥”,而不必重新生成一把。同事也能看到,此ticket有效期为600s

这个session ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法。当服务器收到session ticket以后,解密后就不必重新生成对话密钥了。

4.2 Change Cipher Spec

同样,提示客户端此后的报文将使用Pre-master key进行加密

4.3 Encrypted Handshake Message

被加密的finish信息

5.Encrypted Application Data

客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的随机数C。然后双方使用前面的三个随机数A/B/C,生成”对话密钥”(session key又称master key),之后对信息的加密使用master key进行对称加密。

另外,HTTPS一般使用的加密与HASH算法如下:

非对称加密算法:RSA,DSA/DSS 
对称加密算法:AES,RC4,3DES 
HASH算法:MD5,SHA1,SHA256

参考文档:
HTTPs握手流程抓包解析
图解SSL/TLS协议
中间证书的使用