文章目录
前言
上一节,主要是熟悉一些基本概念和原理,本节主要是介绍,TLS1.2版本协议通讯过程的梳理和优化。这样在遇到分析https网址的时候就有基本思路了
TLS协议的组成
记录协议(Record Protocol)
记录协议规定了TLS收发数据的基本单位:记录(Record)。它有点像是TCP里的segment。所有的其他子协议都是需要通过记录协议发出。但多个记录数据可以在一个TCP包一次性发出。
报警协议(Alert Protocol)
报警协议的职责是向对方发出报警信息,有点类似HTTP里的状态码。比如 protocol_version就是不支持旧版本,bad_certificate 就是证书有问题,收到报警后,另一方可以选择继续,也可以立即终止连接。
握手协议(Handshark Protocol)
浏览器和服务器会在握手过程中协商TLS版本号,随机数,密码套件等信息,然后交换证书和秘钥参数,最终双方协商得到会话秘钥,用于后续混合加密。
变更密码规范协议 (Change Cipher Spec Protocol)
就是一个通知,告诉对方,后续的数据将使用加密保护。而之前的数据都是明文的。
TLS1.2 通讯过程
ECDHE握手
RSA握手(已不是主流)
“Pre-Master”不再需要算法生成,而是客户端直接生成随机数。
HTTPS 优化
硬件优化
软件优化
Linux内核,Nginx, OpenSSL等软件升级
协议优化
如果有可能,尽量采用TLS1.3, 大幅度简化握手过程,完全握手只要1-RTT。
如果使用TLS1.2 握手时秘钥交换协议,尽量采用椭圆曲线的ECDHE算法,它运算速度快,安全性高,还支持“False Start”,能够把握手的消息往返由2-RTT减少到1-RTT。
证书优化
除了秘钥交换,握手过程中的证书验证也是一个耗时的操作,服务器需要把自己的证书链全发给客户端,然后客户端接收后再逐一验证。
客户端证书验证是一个很复杂的操作,除了要公钥解密验证多个证书签名外,因为证书还有可能被撤销失效,客户端有时候还会再去访问CA,下载CRL或者OCSP数据,这又会产生DNS查询,建立连接,收发数据等一系列网络通讯,增加很多RTT。
CRL(Certificate revocation list,证书吊销列表)由CA定期发布,里面是所有被撤销信任的证书序号,查询这个列表就可以知道证书是否有效。
CRL因为是“定期”发布,就有“时间窗口”的安全隐患,而且随着吊销证书的增多,列表会原来越大,一个CRL经常会达到MB。效率不高。
CRL基本上不用了,替代者是OCSP(Online Certificate Status Protocol, 在线证书状态协议),向CA发送查询请求,让CA返回证书有效状态。
但是OCSP也要多出一次网络请求的消耗,而且依赖CA服务器,如果CA服务器很忙,那响应延迟也是等不起的。
OCSP Stapling, 它可以让服务器预先访问CA获取OCSP响应,然后在握手时随证书一起发给客户端,免去客户端连接CA服务器查询的时间。
Nginx 可以通过指令“ssl_stapling on”开启“OCSP Stapling”。
因为OCSP会增加额外的网络连接成本,所以Chrome等浏览器的策略是只对EV证书使用OCSP检查有效性,普通网站的DV,OV证书忽略这个操作。
会话复用
会话复用(TLS session resumption)
Session ID
客户端和服务器端首次连接后各自保存一个会话ID号,内存里存储主秘钥和其他相关信息。当客户端再次连接时候发一个ID过来,服务器就在内存里面找,找到就直接用主秘钥恢复会话状态,跳过证书验证和秘钥交换,只用一个消息往返就建立了安全通讯。
Session Ticket
Session ID 是最早出现的会话复用技术,也是应用最广的,但它也有缺点,服务器必须保存每个客户端的会话数据,服务器负担较重。
Session Ticket方案,类似HTTP的Cookie,存储的责任由服务器转移到了客户端,服务器加密会话信息,用“New Session Ticket”消息发给客户端,让客户端保存。
重连的时候,客户端使用扩展“session_ticket”发送Ticket而不是Session ID,服务器解密后验证有效期,就可以恢复会话,开化加密通讯。
PSK
“Session ID”和“Session Ticket” 这两种会话复用技术在TLS1.3中已经被废除,采用的是PSK实现会话复用。
“False Start” “Session ID” "Session Ticket"等方式只能实现1-RTT,而TLS1.3更进一步实现了“0-RTT”,在发送Ticket的同时会带上应用数据(Early Data),免去了1.2里面的服务器确认步骤,这种方式叫“Pre-shared Key”,简称PSK。