SSL/TLS
-
SSL/TLS加密协议,用于在客户端(如浏览器)和服务器(如网站)之间建立一个安全的、加密的通道,两者之间传输的数据是私密和完整性。
-
SSL - Secure Sockets Layer(安全套接字层),由于设计存在根本性弱点,现已普遍禁用
-
TLS - Transport Layer Security(传输层安全),以SSL为基础的新标准,新名称协议
-
核心目标
- 保密性: 通过加密防止窃听,第三方无法读取破译传输数据(使用2个随机数参数生成的密钥加密数据)
- 完整性:通过消息确认码防止篡改,能检测出数据在传输中是否被篡改过
- 身份验证:通过数字证书验证服务器的身份,确保连接的是真正的目标服务器,也可以有选择的验证客户端的身份
TLS 的设计使得它可以为多种应用层协议提供安全支撑,工作时机原理相同, 如:
HTTPS: 443
SMTPS: 465
IMAPS: 993
POP3S: 995
LDAPS: 636
局限性:服务可以使用任意端口,不能仅凭端口判断
一、协议名称演变

二、TLS协议工作原理
1. 工作时机
1.1 在网络模型中的层级
- 位于经典TCP/IP模型的会话层

1.2 在通信流程中的位置
-
在TCP三次握手之后
建立TCP连接:客户端与服务器3次握手
------>
TLS协议握手:在TCP连接之上,协商TLS版本、选择加密套件、进行身份验证、生成密钥等,建立"安全隧道"
------>
应用层协议在"安全隧道"里面进行通信。此时http ->https
2. TLS握手流程
- 以TLS 1.2 和 RSA密钥交换为例


2.1 第一步:Client Hello
客户端向服务器发起连接

2.1.1 客户端随机数:一个随机字符串,用于后续生成密钥。
- 客户端与服务器通过双方的随机字符串,通过同一个密钥交换算法(非对称加密算法)生成非对称密钥

2.1.2 支持的加密套件列表

- 客户端支持的加密算法、哈希算法、密钥交换算法组合的列表。
2.1.2.1 密钥交换算法
- 非对称算法(ecdh: 椭圆曲线算法 )
- 服务器与客户端都会使用
客户端支持的算法:

客户端会选定其中一个算法,把自己生成的公钥放在这里

- 服务器收到以后,会先看自己支不支持key_share客户端选中的这个算法, 如果不支持,就会在supported_group 里面挑一个自己也支持的算法,在server hello里面告诉客户端; 如果找不到上方都支持的,这次握手就会失败。
2.1.2.2 身份认证算法
- 非对称加密算法(不可伪造、不可否认)
服务器端,使用算法生成的私钥和公钥:
- 私钥用途:1.在握手阶段,客户端想要验证服务器的省份时,服务器用私钥对一些关键信息加密,客户端使用证书里面的公钥解密验证 2.数据传输阶段:服务器使用私钥对数据的hash值进行签名,客户端使用公钥验证签名,可验证数据时服务器发送的,没有被篡改。
- 公钥的使用: 服务将公钥与域名信息、组织签名等信息发给证书颁发机构 , CA验证合法性以后会用自己的私钥对这些信息进行签名(客户使用CA的公钥验证签名,确认服务器的身份和公钥的合法性)生成证书。
- 私钥就是服务器的"数字身份",证明"我就是我",以及保证数据的完整性(没有被篡改)和不可否认性(就是你发的)。

- 支持的TLS版本

- 服务端想访问的目的域名(同一个IP地址可能存在多个域名服务,知道了域名才能返回对应的证书和内容)

2.1.2.3 数据加密算法
- 对称加密算法
数据传输时,对它生成对称加密算法需要的会话密钥(预主密钥),最后双方都通过两个随机数和预主密钥,通过同一个算法(对称加密算法),计算出同一个会话密钥(对称密钥)。
2.1.2.4 消息认证码算法
- 验证数据完整性和真实性,验证数据有没有被篡改
- 带密钥的加密算法:摘要算法(MD5/SHA256等) + 共享密钥 , 比普通的摘要算法多了一层身份认证
2.2 第二步:Server Hello
服务器回应客户端
- 选定的TLS版本
- 服务器随机数:另一个随机字符串,用于后续生成密钥。
- 选定的加密套件:从客户端提供的列表中选择一个双方都支持的、最安全的套件。

各部分的算法解释

- ECDHE :密钥交换算法
- RSA: 身份认证签名
- AES_128_GCM: 数字加密算法
- SHA256: 消息认证码算法
2.3 第三步:Certificate
服务器将其数字证书发送给客户端。证书中包含了服务器的公钥。

2.4 第四:Server key Exchange
- 如果密钥交换算法是ECDHE算法,服务器需要将自己生成对公钥发送给客户端

2.5 第五:Server Hello Done
- 客户端收到服务端的公钥后,结合自己生成的私钥,计算出双方共享的会话密钥,这个会话密钥是后续实际数据加密的关键

2.6 第六步:证书验证
客户端验证服务器证书:
- 检查证书是否由信任的 CA 签发(CA的公钥解密)
- 检查证书是否在有效期内
- 检查证书中的域名是否与正在访问的域名一致
2.7 第七步:Pre-master Secret 生成与加密
- 客户端生成另一个随机字符串,称为 Pre-master Secret。然后,用服务器证书中的公钥对其进行加密,发送给服务器。
- 不是必有的。密钥交换算法如果是RSA算法会有,但是ECDHE就不用。客户端与服务器会各自生成自己的密钥对。
2.8 第八步:服务器解密 Pre-master Secret
- 服务器使用自己的私钥解密,得到 Pre-master Secret。
- 至此,客户端和服务器都拥有了三个值:客户端随机数、服务器随机数和 Pre-master Secret。 双方使用相同的算法,根据这三个值独立计算出相同的主密钥。主密钥再被用于生成后续对称加密所需的会话密钥。
- 不是必有的。密钥交换算法如果是RSA算法会有,但是ECDHE就不用。客户端与服务器会各自生成自己的密钥对。
2.9 第九步:切换至加密通信
- 双方互相发送 Change Cipher Spec 消息后,便是告知对方:"从现在开始,我们之后所有的通信都将使用刚刚协商好的密钥和算法进行加密。"


2.10 第十步:Finished
双方发送一个加密的 Finished 消息。这个消息包含了之前所有握手消息的摘要。对方收到后,会验证摘要是否正确。这既确认了密钥的正确性,也确认了握手过程未被篡改
1.11 开始数据传输
- 把上层应用的数据,(如http, tds, 邮件内容等),用前面协商好的密钥和要加算法惊醒加密,然后封装。不仅负责加密数据,还会给数据加上消息认证码,确包传输过程中数据不会被篡改。

三、TLS1.3 | TLS1.2
