一、SSL/TLS说明
1.1、说明:
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性,是ssl的后续版本。
该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。
Record协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等 。
Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换等。
主要用于解决:
二、TLS交互说明:
2.1、TLS 1.2 协议交互过程:
流程简要说明:
具体可以参见:https://tools.ietf.org/html/draft-whyte-qsh-tls12-02
1、2:TLS运行在TCP基础之上,需要一个完整的来回交互(RTT),完成TCP 三次握手“ 。
3:TCP连接建立后,客户端发送ClientHello,包括:
(1)客户端支持的ssl的最高版本号,如TLS1.2版。
(2)客户端支持的加密套件列表,如RSA公钥加密。
(3)确定的会话ID(用于恢复会话使用,server端会存储关于session id的对应的通信秘钥,当匹配的时候,会使用缓存的对称秘钥)
(4)客户端所支持的压缩算法列表
(5)一个用于生成对话秘钥的32位随机数
4:服务器发送ServerHello,包含:
(1)服务端选择的ssl的版本(选择方式为选择客户端和服务端最高版本中的较低的那一个)
(2)服务端选择的加密套件,如RSA公钥加密。
(3)会话ID(用于恢复会话使用,server端会存储关于session id的对应的通信秘钥,当匹配的时候,会使用缓存的对称秘钥)
(4)客户端选择的压缩算法
(5)一个用于生成对话秘钥的32位随机数
5:双方协商好一个共同的TLS版本和加密算法,客户端使用服务器提供的证书,生成新的对称密钥,并用服务器的公钥进行加密,通知服务器切换到加密通信流程。
以上,除了对称密钥是服务器端的公钥加密,其他都是明文。
6:服务器用自己的私钥解密客户端发过来的对称密钥,通过验证MAC检查消息的完整性,并返回给客户端一个加密的“Finished”的消息。客户端采用对称密钥解密消息,并验证MAC,如果一切OK,加密隧道就建立好了。
7:使用加密隧道传输数据
注: TLS1.2 基于RSA加密,TLS1.3 基于ECDH,减少了一个RTT交互过程。
RSA说明 见:RSA原理说明
2.2、TLS 1.3 协议交互过程:
2.2.1、ECDH:
2.2.1.1、简要说明:
ECDH是基于ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制,参看ECC)的DH( Diffie-Hellman)密钥交换算法。交换双方可以在不共享任何秘密的情况下协商出一个密钥。
ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点P,一个整数k,求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。ECDH即建立在此数学难题之上。
2.2.1.2、秘钥交换过程:
假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。
1.Alice生成随机整数a,计算A=a*G。Bob生成随机整数b,计算B=b*G。
2.Alice将A传递给Bob。A的传递可以公开,即攻击者可以获取A。由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过A、G计算出a。Bob将B传递给Alice。同理,B的传递可以公开。
3.Bob收到Alice传递的A,计算Q=b*A
4.Alice收到Bob传递的B,计算Q‘=a*B
Alice、Bob双方即得Q=b*A=b*(a*G)=(b*a)*G=(a*b)*G=a*(b*G)=a*B=Q' (交换律和结合律),即双方得到一致的密钥Q。
2.2.2、协议交互过程:
流程简要说明:
具体可以参见:https://tools.ietf.org/html/draft-ietf-tls-tls13-28
1、2:TLS运行在TCP基础之上,需要一个完整的来回交互(RTT),完成TCP 三次握手“ 。
3:TCP连接建立后,客户端发送ClientHello,包括:
(1)客户端支持的ssl的最高版本号
(2)客户端支持的加密套件列表
(3)确定的会话ID
(4)客户端所支持的压缩算法列表
其中key_share记录了a*G,其中G是一个大家都知道的大数。服务器拿到a*G,计算得到Q=b*a*G(核心思想,实际逻辑要比这复杂),得到对称秘钥。
4:服务器发送ServerHello,包含:
(1)服务端选择的ssl的版本(选择方式为选择客户端和服务端最高版本中的较低的那一个)
(2)服务端选择的密码套件
(3)会话ID
(4)客户端选择的压缩算法
其中key_share记录了b*G,客户端拿到b*G就可以计算得到Q=a*b*G(核心思想,实际逻辑要比这复杂),得到对称秘钥。
5:客户端会返回验证信息、证书信息等给服务器。
6:使用加密隧道传输数据