TLS通讯过程

image-20230124025020824

  1. ClientHello

    客户端向服务器发出加密通讯请求,同时向服务器提供:

    • 客户端支持的TLS版本
    • 客户端生成的随机数,用于生成对话密钥
    • 支持的加密方法
    • 支持的压缩方法

    image-20230124012839695

  2. ServerHello

    服务器收到客户端请求后,向客户端响应如下内容:

    • 确定使用的加密通信协议版本

    • 确定使用的加密套件

      下图的加密套件采用了ECDHE如果采用的RSA或其他,那么过程会有差异

      image-20230124053713733

      • 密钥交换算法:ECDHE

      • 签名算法:RSA

      • 加密算法:AES_128 GCM模式

      • 摘要算法:SHA256

    • 确定使用的压缩方式

    • 服务器证书

    • 当前时间

    • 要求客户端提供证书(可选)

    image-20230124015717026

    由于是采用的ECDHE进行密钥交换,因此服务器将采用椭圆曲线算法将这个公钥发送给客户端

    image-20230124020634121

    服务端在第二次握手报文中包括:Server Hello, Certificate, ServerHelloDone共计三个报文。习惯将其称之为ServerHello

  3. 客户端回应

    客户端收到服务器的三个响应报文后,会检测Server Hello中的协商结果是否是Client Hello中支持的,同时也检查收到的服务器证书,是不是可信任的证书。如果证书过期或是不可信任颁发机构,就会向访问者显示一个警告,告诉其是否需要继续通信

    如果证书没有问题,客户端会生成一个随机数,作为ECDHE的临时私钥,并通过服务端在Server Key Exchange中发送的椭圆曲线参数计算出自己的ECDHE公钥信息,然后通过Client Key Exchange向服务器回应:

    image-20230124021303749

  4. 服务器响应:

    服务器收到客户端的响应后,获取里面的DH算法公钥,计算出ECDHE协商出的预共享密钥。然后通过Client Random,Server Random,ECDHE协商出的共享密钥计算出会话密钥,然后依次生成其他密钥。然后发送Change Cipher Spec通知客户端,采用新协商的安全参数进行通信,以后发送的数据全部进行加密。

    此外服务端同样对所有握手报文做一个摘要,并进行加密然后发送给客户端一个Encrypted Handshake Message消息,验证客户端是否可以正常解密

    image-20230124024954898

TLS握手优化

TLS通讯过程可分为两部分:

  • 交换密钥
  • 加密数据

Nginx主要是在TLS握手过程中的椭圆曲线加密算法和RSA的非对称加密算法做优化

小文件多:重点优化椭圆曲线加密算法的密码强度

大文件多:考虑AES算法的替换或调整密码强度