摘要
TLS握手时采用的加密方式
非对称加密和对称加密。
非对称加密主要用来保护对称加密密钥交换的安全性,一旦客户端和服务端交换密钥完成,即可使用密钥采用对称加密的方式进行通信。
基于RSA密钥协商算法的TLS1.2握手分析
TLS握手的总过程
TLS1.2握手的过程由于本人本地密码套件不支持,相关图片来源于网络。
客户端的ClientHello
服务端的ServerHello
Cipher Suite的格式
Cipher Suite虽然很长,但是它是一个固定格式,基本的格式为:
密钥交换算法 + 签名算法 + WITH + 对称加密算法 + 摘要算法。
比如上图中的我们的使用的算法分别为:
服务端如何证明自己的身份
服务端为了证明自己的身份会发送Server Certificate给客户端,这个消息里面包含数字证书。具体信息如下:
除了发送了证书,服务端还发送了Server Hello Done消息,目的是告诉客户端你要的东西我都给你了。具体内容如下:
TLS第三次握手
客户端在验证证书无误后,会发起第三次握手请求,首先会发送Client Key Exchange消息,内容如下:
客户段会生成pre-master随机数,并使用服务端RSA公钥进行加密发送给服务器,Encrypted PreMaster就是经过加密后的随机数,服务器收到后可以使用私钥解密。
至此,客户段使用三个随机数可以生成会话密钥了,于是生成会话密钥以后会发送一个Change Cipher Spec消息告诉服务端开始使用加密的方式传输。
最后客户端会发送一个Encrypted HandShake Message,这个就是把之前的数据做个摘要,然后再用会话密钥加密发送给服务器,供服务器验证。
TLS第四次握手
第4次握手其实就是服务器发送个Change Cipher Spec消息(由于服务器收到了第三个随机数,因此也可以生成会话密钥,后续可以加密传输了)和个Encrypted HandShake Message消息,握手完成。
可以看出,Change Cipher Spec之前的消息都是明文传输,之后都是通过对称密钥加密传输。
数字证书
数字证书包含的内容
数字证书如何签发
客户端如何校验服务端的数字证书
证书链是啥
我们向CA申请的证书一般都不是由根证书签发,而是由中间证书签发,比如上述思否(segmentfault.com)的证书,证书有三级。
那么具体的验证过程如下:
从上图中可以看出思否证书的签发根证书DigiCert Global Root CA已经在我的MacOS操作系统中预置。
DHE和ECDHE算法
RSA密钥协商算法的缺陷
由于我们的客户端传递随机数都是使用公钥加密,服务端收到后使用私钥解密。所以一旦我们服务器的私钥遭到泄漏,我们就可以对过往截获服务器客户端的TLS报文进行解密(无法向前保密)。
今日截获数据,明日(或未来)解密数据。
RSA有缺陷如何解决
RSA密钥协商算法既然无法向前保密,后面使用了新的协商算法:
DH算法是什么?
DH算法是非对称加密算法,因此也可用作密钥交换,核心思想就是离散对数。
# 对数运算
x = log2y
上述公式其中x为对数,y为真数,底为2。对于上述例子,32的对数是5,64的对数是6,可以看出对数的取值是能够连续的。
但是离散对数的取值是无法连续,离散也是因此得名。
a ^ i (mod p) = b
对于一个整数b和一个质数p的一个原根a,能够找到唯一一个指数i使得上述公式成立,那么指数i称为b的以a为底数的模p的离散对数。
底数a和和模p是离散对数的公开参数,b是真数,i是对数,知道了对数i我们很轻松就能算出真数b,但是如果知道真数b但是很难计算对数i,尤其是模p很大的时候,现有的计算机的计算能力是无法破解的。
DH算法如何交换密钥
小c的公钥为A:A = g ^ a (mod p) 小s的公钥为B: B = g ^ b (mod p)
可以看出我们通过私钥生成公钥很容易,但是通过公钥逆向计算私钥绝对是地狱级别的困难,如果您能算出来说不定你就是未来量子(手动狗头)。
双方交换公钥以后,客户端小c有:
服务器端小s有:
客户端小c会做以下计算:
K = B ^ a (mod p)
服务端小s会做以下计算:
K = A ^ b (mod p)
由于离散对数具有幂的交换律,因此客户端和服务端计算出来的K值就是相等的,这个K就是对称加密密钥。
DH算法的种类
目前有两种:
static DH就是有一方私钥固定不变(通常为服务器端),虽然很难破解但是随着时间的推移还是有一定几率被破解的,不具备向前保密。
DHE就是让每次双方在进行密钥协商时,都随机生成私钥,这样每次通信过程都是独立的,即使你破解了此次的私钥,也无法破解过往的通信。
ECDHE算法是啥?
在DHE算法的基础上利用了ECC椭圆曲线的特性,用更少的计算量计算公钥。
为什么需要ECDHE算法
DHE算法由于需要大量的乘法运算,计算性能不高,所以出现了ECDHE算法来替代他。
ECDHE算法密钥交换过程
基于ECDHE密钥协商算法的TLS1.2握手分析
客户端发起第一次握手请求这个采用RSA协商算法的握手无区别,这里就不说了。
TLS第二次握手
当服务端进行响应,进行第二次握手就可以有区别了,主要有两步如下图:
首先回应ServerHello消息,如下:
这里使用TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256密码套件,说明我们的密钥协商算法要使用ECDHE。
然后第二步中先是发送证书给客户端以示清白,紧接着这里就和之前RSA密钥协商的TLS握手有区别了,这里会发送Server Key Exchange的消息,我们看一下消息内容:
最后服务端在发送一个Server Hello Done消息,告诉客户端这是我提供的信息。
目前客户端和服务端已经共享了两个随机数、使用的椭圆曲线,椭圆曲线基点G,服务器的椭圆公钥
TLS第三次握手
这一步客户端会发送Client Key Exchange消息,消息如下:
到这里服务器和客户端又多共享了客户端公钥,按道理已经可以计算出对称密钥了,但最终的会话对称密钥为了更加安全是使用「客户端随机数 + 服务器随机数 + 椭圆曲线计算出来的共享密钥」来生成最终的会话密钥。
算好会话密钥以后,紧接着会发送一个Change Cipher Spec消息告诉服务段后续的数据我会通过会话对称密钥加密传输。
最后会发送Encrypted Handshake Message,这部分消息就是对之前发送的数据做个摘要,然后使用对称密钥加密以后传输给服务器。
第三次握手以后,不需要等待服务器的第四次握手既可以进行传输应用数据,如下图:
TLS第四次握手
服务器在收到客户端的请求后,也会发送Change Cipher Spec消息和Encrypted Handshake Message。
至此握手完成,以后数据就可以正常加密传输了。
ECDHE和RSA密钥协商算法的区别
目前TLS已经发展到1.3,1.3对比1.2也有了很多优化,有兴趣的读者可以去了解一下。