# SSL/TLS

HTTPS 是 HTTP 建立在 SSL/TLS 安全协议上的。通过 SSL 证书验证服务的身份,并为浏览器和服务器之间的通信进行加密。采用对称加密、非对称加密、身份认证等技术进行混合加密传输。属于 OSI 中的第五层(安全层),默认端口是 443。与普通的发送 HTTP 请求相比,多了一个握手的过程,HTTPS 需要在 TCP 上建立安全链接之后,才能收发 HTTP 报文。

TIP

SSL(Secure Sockets Layer):安全套接字层,TLS(Transport Layer Security):传输安全层,前身是 SSL。

通信安全需要同时具备机密性(不被窃听)、不可否认、完整性、身份认证(证明自己)

# TLS 组成

TLS 包含了几个子协议,每个子协议各自负责不同的模块。

# 记录协议(?)

规定了 TLS 收发数据的基本单位:记录(record)。所有其他的协议都需要通过记录协议发出。

# 警报协议

向对方发出警报信息。比如 protocol_version 是对版本的限制,bad_certificate 是证书有问题,收到的一方可以选择继续或终止。

# 握手协议

协商 TLS 版本号,随机数,密码套件(建立连接时的加密算法组合)等信息,然后交换证书和秘钥参数,最终双方协商得到会话秘钥,用于后续的混合加密系统。

# 变更密码规范协议

告诉对方,后续数据都用加密保护。

# 握手流程

1、客户端通过 URL 访问服务器建立 SSL/TLS 连接,将协议版本号,生成一个随机数(client_random),以及支持的加密方法发送到服务器。

Handshake Protocol: Client Hello
    Version: TLS 1.2 (0x0303)
    Random: 1cbf803321fd2623408dfe…
    Cipher Suites (17 suites)
        Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
        Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)

2、服务端收到请求,确认加密算法,并生成一个 serve_random,以及网站支持的证书(包含公钥等信息)发送到客户端。

Handshake Protocol: Server Hello
    Version: TLS 1.2 (0x0303)
    Random: 0e6320f21bae50842e96…
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)

3、客户端收到证书后进行,得到服务端的信息及公钥,协商安全等级(信息加密的等级)。

4、验证成功后,生成一个新的随机数 Premaster_secret,经过公钥加密后,发给服务器。

5、服务器收到 Premaster_secret 后,私钥解密。

6、后面根据约定好的加密算法,使用 client_random、serve_random、Premaster_secret 生成对话秘钥,进行整个对话。

TIP

TLS 握手成功之后,客户端必须要发送一个连接前言,用来确认 HTTP2 的链接。

# 优缺点

# HTTP 中存在问题(HTTPS 解决的问题)

  • 请求明文,容易被截取窃听
  • 数据完整性未校验,容易被篡改
  • 没有验证对方身份,存在冒充风险

# HTTPS 的缺点

  • 多次握手,耗时
  • SSL 证书需要花钱
  • 涉及的安全算法消耗 CPU 资源

# 加密

对信息的加密保证了机密性

对称加密:加解密的秘钥相同。常见有的 AES,ChaCha20。

非对称加密:分为公钥(public key)和私钥(private),两个秘钥不同,公钥可以公开,但是私钥必须要个保密。公钥和私钥具有单向性,经过公钥加密的内容,只能通过私钥解密,通过私钥加密的内容,只能通过公钥解密。常见的有 DSA、RSA、ECC。

混合加密:在通信开始的时候,使用非对称加密,解决秘钥交换的问题。对称加密的会话秘钥,经过公钥/私钥加密后,发送给对方,对方拿到后就用私钥/公钥解密,取出对称加密的会话秘钥

# 摘要算法

摘要算法保证数据的完整性

常用的算法有 MD5 和 SHA-2(SHA224、SHA256、SHA384 等),内容经过加密算法生成摘要信息,然后使用会话秘钥对消息和摘要进行加密。

# 数字签名和证书

# 数字签名

数字签名 保证通信的身份认证不可否认

原理:使用私钥进行加密,公钥进行解密。由于非对称加密的效率较低,所以私钥只加密摘要信息。签名和公钥完全公开,但是经过私钥加密的,只能通过对应的公钥进行解密。通过公钥解密后,再与原文进行对比验证完整性,就可以确定消息确实是正确的。 CA(Certificate Authority ,证书认证机构),对网站的公钥签名,保证公钥的可信性。

# TLS 兼容

对于老版本的 TLS,通过扩展协议,实现新老版本的兼容。对于 TLS1.3 版本的洗衣,握手的消息中增加了supported_versions扩展,标记了 TLS 的版本号信息。

# 优化

握手的过程比较耗时。

  • 硬件优化,SSL 加速卡、加速服务器等。
  • 使用 TLS1.3,简化了握手过程,完全握手只需要 1-RTT,以及一些算法的升级,取消了 Key Exchange 的过程。
  • 证书优化 证书传输和认证
  • 会话复用 客户端和服务器,各自保存第一次的会话 ID,客户端再次发送请求的时候,将第一次的会话 ID 带上。
  • 会话票证 客户端保存一个票证信息 session_ticket,会话的时候,服务器验证是否过期。

# 握手过程

  • 客户端发出请求(clienthello),会带上以下信息
    • 客户端支持的协议版本
    • 客户端支持的加密算法
    • 客户端生成的随机数,用于生成 ‘对话秘钥’
    • 客户端支持的压缩方法
  • 服务端回应(serverhello),会包含一下内容
    • 确认加密协议版本
    • 生成随机数,用于生成 ‘对话秘钥’
    • 确认加密算法,并发送对应的公钥
    • 服务器证书
  • 客户端回应
    • 验证证书
    • 编码改变通知,标识随后的信息都是加密过的
    • 通过服务端的公钥生成一个随机数 (pre-master key)
    • 客户端握手结束通知,发送前面所有内容的 hash 值,供服务器验证
  • 服务端回应
    • 编码改变通知,标识随后的信息都是加密过的
    • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的 hash 值,用来供客户端校验。

SSL/TLS 协议运行机制的概述 彻底搞懂 HTTPS 的加密原理