TLS握手过程
TLS通讯过程
ClientHello
客户端向服务器发出加密通讯请求,同时向服务器提供:
- 客户端支持的TLS版本
- 客户端生成的随机数,用于生成对话密钥
- 支持的加密方法
- 支持的压缩方法
ServerHello
服务器收到客户端请求后,向客户端响应如下内容:
确定使用的加密通信协议版本
确定使用的加密套件
下图的加密套件采用了ECDHE,如果采用的RSA或其他,那么过程会有差异
密钥交换算法:ECDHE
签名算法:RSA
加密算法:AES_128 GCM模式
摘要算法:SHA256
确定使用的压缩方式
服务器证书
当前时间
要求客户端提供证书(可选)
由于是采用的ECDHE进行密钥交换,因此服务器将采用椭圆曲线算法将这个公钥发送给客户端
服务端在第二次握手报文中包括:Server Hello, Certificate, ServerHelloDone共计三个报文。习惯将其称之为ServerHello
客户端回应
客户端收到服务器的三个响应报文后,会检测Server Hello中的协商结果是否是Client Hello中支持的,同时也检查收到的服务器证书,是不是可信任的证书。如果证书过期或是不可信任颁发机构,就会向访问者显示一个警告,告诉其是否需要继续通信
如果证书没有问题,客户端会生成一个随机数,作为ECDHE的临时私钥,并通过服务端在Server Key Exchange中发送的椭圆曲线参数计算出自己的ECDHE公钥信息,然后通过Client Key Exchange向服务器回应:
服务器响应:
服务器收到客户端的响应后,获取里面的DH算法公钥,计算出ECDHE协商出的预共享密钥。然后通过Client Random,Server Random,ECDHE协商出的共享密钥计算出会话密钥,然后依次生成其他密钥。然后发送Change Cipher Spec通知客户端,采用新协商的安全参数进行通信,以后发送的数据全部进行加密。
此外服务端同样对所有握手报文做一个摘要,并进行加密然后发送给客户端一个Encrypted Handshake Message消息,验证客户端是否可以正常解密
TLS握手优化
TLS通讯过程可分为两部分:
- 交换密钥
- 加密数据
Nginx主要是在TLS握手过程中的椭圆曲线加密算法和RSA的非对称加密算法做优化
小文件多:重点优化椭圆曲线加密算法的密码强度
大文件多:考虑AES算法的替换或调整密码强度