- Published on
SSL/TLS 握手流程详解
SSL/TLS 握手流程详解
SSL(Secure Sockets Layer)和它的继任者 TLS(Transport Layer Security)是互联网上最广泛使用的加密协议。本文将详细介绍 SSL/TLS 握手的完整流程。
安全
机密性、完整性,身份认证和不可否认
机密性(Secrecy/Confidentiality)是指对数据的“保密”,只能由可信 的人访问,对其他人是不可见的“秘密”,简单来说就是不能让不相关的 人看到不该看的东西。
完整性(Integrity,也叫一致性)是指数据在传输过程中没有被窜改。
身份认证(Authentication)是指确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。
不可否认(Non-repudiation/Undeniable),也叫不可抵赖
加密方式概述
在了解 SSL/TLS 握手流程之前,我们需要先理解两种基本的加密方式:对称加密和非对称加密。
对称加密
对称加密使用相同的密钥进行加密和解密:
- 优点:
- 加密速度快
- 计算资源消耗少
- 适合大量数据传输
- 缺点:
- 密钥分发困难
- 密钥管理复杂
- 安全性相对较低
- 常见算法:AES、DES、3DES
非对称加密
非对称加密使用一对密钥:公钥和私钥:
- 优点:
- 安全性高
- 密钥分发简单
- 可实现数字签名
- 缺点:
- 加密速度慢
- 计算资源消耗大
- 不适合大量数据传输
- 常见算法:RSA、ECC、DSA
SSL/TLS 中的混合加密
SSL/TLS 协议巧妙地结合了两种加密方式的优点:
- 密钥交换阶段:
- 使用非对称加密安全传输会话密钥
- 解决了对称加密密钥分发的问题
- 数据传输阶段:
- 使用对称加密进行实际数据传输
- 保证了通信效率
- 降低了资源消耗
这种混合加密方式既保证了密钥交换的安全性,又确保了数据传输的效率。
密钥的来源和分配
在 SSL/TLS 握手过程中,涉及到的密钥来源如下:
握手流程概述
SSL/TLS 握手是客户端和服务器在进行加密通信之前建立安全连接的过程。整个过程可以分为以下几个关键步骤:
Client Hello
- 客户端向服务器发送第一个握手消息
- 包含支持的 SSL/TLS 版本
- 支持的加密套件列表
- 随机数(Client Random)
Server Hello
- 选择使用的 SSL/TLS 版本
- 选择使用的加密套件
- 服务器生成的随机数(Server Random)
- 服务器的数字证书
- 证书中包含了对签发者、签发时间、公钥、签名算法等信息的签名(Hash1),并用CA的私钥进行加密(EHash1),用于验证证书是否被篡改
**server key exchange **
- 如果使用ECDHE算法,那么这一步会发送算法所需要的参数(server params)包括椭圆曲线的参数G以及一个公钥
Server_Q
- 这一步中服务端生成临时的私钥ServerPrivate
G · ServerPrivate
=Server_Q
。把Server_Q
发送给客户端
- 如果使用RSA算法,这一步会被省略
- 如果使用ECDHE算法,那么这一步会发送算法所需要的参数(server params)包括椭圆曲线的参数G以及一个公钥
server hello done
- 服务器表示消息发完了
证书验证
- 客户端逐级验证服务器证书是否由受信任的根 CA 签发、是否在有效期内、域名是否匹配
- 客户端从证书中提取签名算法,用这个算法对证书的内容计算签名(Hash2)并使用CA的公钥解密EHash1,比较Hash1和Hash2是否一致,确认证书是否被篡改
- OCSP 协议或 CRL 列表查询证书是否被 CA 主动吊销
client key exchange
如果使用ECDHE算法,那么这一步客户端发送算法所需要的参数(client params)
- 这一步中服务端生成临时的私钥ClientPrivate
G · ClientPrivate
=Client_Q
。把Client_Q
发送给服务端
现在客户端和服务端根据(client params)和(server params)生成Pre-Master
Pre-Master
=ClientPrivate · Server_Q
=ServerPrivate · Client_Q
=ClientPrivate · ServerPrivate · G
然后根据pre-master、clinet Random和server Random生成master secret
上面这些步骤中私钥都没有发送出去,所以能够保证安全
如果使用RSA算法,这一步客户端直接用证书中的公钥加密pre-master,然后发送给服务端
client change ciper spec
- 客户端通知服务器,接下来的通信将使用对称加密
- 发送之前所有的消息并进行签名
serverr change ciper spec
- 服务端通知服务器,接下来的通信将使用对称加密
- 发送之前所有的消息并进行签名