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 Server Key Exchange报文
这部分还没弄明白作用,前面client hello
的Extension
字段中也有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