SSL/TLS整理

主要按照以下四个方面进行

一、什么是SSL/TLS

SSL全称是Secure Sockets Layer,安全套接字层,它是由网景公司(Netscape)设计的主要用于Web的安全传输协议,目的是为网络通信提供机密性、认证性及数据完整性保障。如今,SSL已经成为互联网保密通信的工业标准。

SSL/TLS协议能够提供的安全目标主要包括如下几个:

认证性——借助数字证书认证服务器端和客户端身份,防止身份伪造

机密性——借助加密防止第三方窃听

完整性——借助消息认证码(MAC)保障数据完整性,防止消息篡改

重放保护——通过使用隐式序列号防止重放攻击

为了实现这些安全目标,SSL/TLS协议被设计为一个两阶段协议,分为握手阶段和应用阶段:

握手阶段也称协商阶段,在这一阶段,客户端和服务器端会认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及MasterSecret。后续通信使用的所有密钥都是通过MasterSecret生成。

在握手阶段完成后,进入应用阶段。在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

SSL/TLS协议有一个高度模块化的架构,分为很多子协议,如下图所示:

子协议

Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换;

ChangeCipherSpec 协议:一条消息表明握手协议已经完成;

Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告;

Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。

二、协议流程

HTTPS的主要作用是在不安全的网络上创建一个基于TLS/SSL协议的安全信道,对窃听和中间人攻击提供一定程度的合理防护。TLS/SSL握手的基本流程如下图描述:

TLS/SSL握手基本流程图

  1. Client Hello
  • Client Hello 报文:客户端对加密算法的支持度不同,因此需要向服务端发送客户端支持的 加密套件(Cipher Suite) ,同时还要生成一个 随机数 同时保存在客户端和发送给服务
  1. Server Hello
  • ServerCertificate 报文:服务端收到 Client Hello 之后,向客户端发送 CA 认证的数字证书,用来鉴别服务端身份信息,同时还要生成一个 随机数 同时保存在服务端和发送给客户端
  • Server Hello Done 报文:表示服务端宣告第一阶段的客户端服务端握手协商结束

  • 可选:Certificate Request 报文:必要情况下,要求客户端发送证书验证身份

  • 可选:Server Key Exchange 报文:如果 CA 认证的数字证书提供的信息不够,服务端还可发送提供补充信息
  1. Client Finish
  • Client Key Exchange 报文:客户端收到 CA 数字证书并通过验证,然后通过 CA 公钥解密获取到 服务端公钥。Client Key Exchange 报文包括有一个随机数,这个随机数被称为 Pre-master key/secret;一个表示随后的信息使用双方协商好的加密方法和密钥发送的 通知 ;还有一个通过协商好的 HASH 算法对前面所有信息内容的 HASH 计算值,用来提供服务端校验。这些信息都通过服务端公钥加密传送给服务端
  • ClientCipherSpec 报文:该报文通知服务端,此后的通信都将使用协商好的加密算法计算对称密钥进行加密通信(也就是使用两个随机数以及第三个 Pre-master key/secret 随机数一起算出一个对称密钥 session key/secret)
  • Finished 报文:该报文包括连接至此的所有报文的校验值,使用服务端公钥进行加密
  • 可选:ClientCertificate 报文:如果服务端请求,客户端需要发送 CA 数字证书
  • 可选:CertificateVerify 报文:服务端如果要求 CA 数字证书,那么需要通过 HASH 算法计算一个服务端发送来的信息摘要
  1. Server Finish
  • 服务端最后对客户端发送过来的 Finished 报文使用服务端私钥进行解密校验
  • ClientCipherSpec 报文:报文通知服务端,此后的通信都将使用协商好的加密算法计算对称密钥 session key/secret 进行加密通信
  • Finished 报文:标志 TLS 连接建立成功
    1. TLS 握手成功此后通过对称密钥 session key/secret 加密通信

认证又分单向认证和双向认证,流程分别如下图所示

单向认证

双向认证

三、使用wireshark抓取网络包

wireshark使用不再描述

  1. Client Hello

client hello

Client Hello 阶段,客户端给服务端发送一个随机数,以及 Cipher Suites 客户端支持的所有加密套件

  1. Server Hello

server hello

Server Hello 阶段,服务端给客户端发送一个随机数,以及选中的 Cipher Suite 加密套件

然后服务端继续发送给客户端 CA 数字证书以及 Server Key Exchange 和 Hello done 信息完成第一阶段的握手:

第一阶段握手完成

这个是证书:

证书

这个是 Server Key Exchange,可以看到协商了一种加密算法:

加密算法

这个是 Server Hello Done:

server done

  1. Client Finish

client finish

客户端发送一个 Client Key Exchange,Change Cipher Spec 和 Finished 报文

Finished Verify Data 包括至此连接的所有报文的校验信息,用服务端提供的公钥加密

客户端准备好切换为对称密钥加密

  1. Server Finish

server finish

最后服务端返回一个 Change Cipher Spec 和 Server Finish

服务端准备好切换为对称密钥加密

  1. TLS 握手成功

至此,TLS 握手成功,在 wireshark 中就可以看到接下来就是 HTTP 的请求响应封包了:

握手成功

四、使用ssllabs对域名进行分析

可以直接访问ssllabs对域名证书进行检测

ssllabs首页

在Hostname处输入域名,最好勾选Do not show the results on the boards

然后等待几分钟后,可以得到检测结果

检测结果

  • Summary

    检测的综合结果

  • Certificate

    证书的信息

  1. Server Key and Certificate

| 名称 | 含义 | | — | — | | Valid from | 证书有效期开始时间 | | Valid until | 证书有效期结束时间 | | Issuer | 颁发机构 | | Signature algorithm | 证书签名算法 | | Trusted | 证书是否被信任 |

  1. Additional Certificates
名称 含义
Subject 子机构
Issuer root CA机构
Valid until 有效期结束时间
  • Configuration
  1. Protocols

    支持哪些协议

  2. Cipher Suites

    支持哪些加密组合

  3. Handshake Simulation

    各个平台握手协议的模拟。当出现某端请求异常时, 可以着重关注一下本处

五、SSL/TLS异常处理思路

TLS层面的问题在客户端的症状表现上有相似之处,但是问题的根因却大相径庭。基本的排查思路如下:

  1. 判断问题是否属于TLS/SSL层面的问题。

  2. 抓取网络包;有条件的情况下,可以针对正常和异常情况抓取两份网络包,以便后续进行对比分析。

  3. 根据网络包探寻问题发生的直接原因,进而进一步探究问题的根本原因。

  4. 根据分析结论并结合业务场景,选择合适的解决方案。

具体案例可以参考阿里云客户端证书错误避坑指南提供一定思路