HTTPS的基本理解以及加密流程
目录
HTTP 和 HTTPS的区别
HTTP的问题
HTTPS
TLS和SSL的关系
HTTPS的流程
数字证书的验证
1. 证书申请(服务端 → CA)
2. CA 签发证书
3. 客户端验证证书
4. 密钥交换与加密通信
客户端验证数字证书的具体流程
问题1:CA对服务端公钥是进行加密还是签名?
问题2: 为什么不用非对称加密传输所有数据?
为什么非对称加密比对称加密开销大?
问题3: 如何防止 CA 被篡改?
预主密钥(Pre-Master Secret)
TLS 四次握手流程(TLS1.2版本+RSA算法)
密码套件编辑
交互的包个数
消息类型
编辑
1. Client Hello
2. Server Hello
3. Certificate(证明)
4. Server Hello Done
5. Client Key Exchange(客户端密钥交换)
6. Change Cipher Spec(更改密码规范)
7. Finished
8. Change Cipher Spec
9. Finished
TLS是几次握手(不同版本)
RSA 和 ECDHE 的区别(密钥交换算法)
握手流程对比
RSA 密钥交换(TLS 1.2 示例)
ECDHE 密钥交换(TLS 1.2/1.3 示例)
总结
TLS 1.3 版本的变化
HTTP 和 HTTPS的区别
- HTTP:无加密协议。传输的数据是明文的,因此不具备保护用户隐私或防止数据被篡改的机制。如果你通过 HTTP 访问网站,所有的数据(如用户名、密码等)都可能被窃取。
- HTTPS:是基于 HTTP 协议的加密版本,它使用 SSL/TLS 加密协议(安全套接层/传输层安全协议)对数据进行加密数据,并使用数字证书进行身份验证。通过加密和身份验证机制,确保数据在传输过程中不会被窃听、篡改或伪造。
使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
- HTTP:默认使用 80 端口。
- HTTPS:默认使用 443 端口。
- HTTP:由于没有加密和解密操作,HTTP 的性能相对较高,传输速度更快。
- HTTPS:由于 SSL/TLS 加密和解密需要计算过程,HTTPS 的性能略低于 HTTP。
HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP三次握手 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议。
- HTTP:现代浏览器逐渐减少对 HTTP 的支持,谷歌等搜索引擎已经明确表示,HTTPS 会在搜索排名中获得更高的优先级。某些浏览器还会对 HTTP 网站标注“不安全”。
- HTTPS:被所有主流浏览器广泛支持,并且作为“安全”网站的标志。许多浏览器(如 Chrome)会在地址栏显示一个绿色的锁图标,表示网站是通过 HTTPS 保护的。

HTTP的问题
- 窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
- 篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
- 冒充风险,比如冒充淘宝网站,用户钱容易没。

- 信息加密: HTTP 交互信息是被加密的,第三方就无法被窃取;
- 校验机制:校验信息传输过程中是否有被第三方篡改过,如果被篡改过,则会有警告提示;
- 身份证书:证明淘宝是真的淘宝网;
HTTPS
TLS和SSL的关系
- SSL(Secure Sockets Layer):由 Netscape 公司在 1990 年代开发,包括 SSL 2.0 和 SSL 3.0,但由于严重的安全漏洞(如 POODLE 攻击),现在已被完全弃用。
- TLS(Transport Layer Security):是 SSL 的继任者,由 IETF(互联网工程任务组)标准化,目前主流版本是 TLS 1.2 和 TLS 1.3。TLS 1.0(1999)→ TLS 1.1(2006)→ TLS 1.2(2008)→ TLS 1.3(2018)。
HTTPS的流程
- TCP 三次握手:建立基础连接。
- SSL/TLS 握手:验证服务器身份和协商加密算法等参数,然后再进行数据传输。
HTTPS传输流程中包含的内容:1. 公钥证书认证:这一步的目的是为了保证客户端获得的是正确的、未被篡改的服务端公钥,防止客户端得到的服务端密钥是被中间人攻击过的2. 使用非对称加密交换对称加密的密钥3. 使用对称加密传输实际的数据
数字证书的验证

1. 证书申请(服务端 → CA)
- 服务端生成密钥对:服务端先生成自己的非对称密钥对。
- 提交 CSR(证书签名请求):服务端向CA(证书颁发机构)提交CSR(包含公钥、域名、组织信息等),不发送私钥。
2. CA 签发证书
- CA验证身份:CA通过域名所有权、企业资质等验证服务端身份。
- 生成证书:CA用自己的私钥对服务端的公钥和相关信息签名,生成数字证书。证书内容包含:服务端公钥 + 域名 + 有效期 + CA 签名。
3. 客户端验证证书
- 服务端发送证书:在 TLS 握手阶段,服务端将证书(server.crt)发送给客户端。
- 客户端验证证书链:
- 用 CA 的公钥(CA的公钥已提前设置在操作系统/浏览器中)验证证书签名是否合法。
- 检查证书是否过期、域名是否匹配、是否被吊销。若验证通过,客户端确认服务端公钥可信的,而不是中间人发送的恶意的公钥(最主要的就是证明这一步内容)。
4. 密钥交换与加密通信
- 非对称加密(仅用于密钥交换):
- 客户端生成预主密钥(Pre-Master Secret),用服务端的公钥加密后发送。
- 服务端用自己的私钥解密获取 Pre-Master Secret。
- 对称加密(用于数据传输):双方用 Pre-Master Secret 生成会话密钥(如 AES 密钥),后续所有数据用对称加密传输。
客户端验证数字证书的具体流程
- 客户端(如浏览器)在TLS握手时,从服务端接收到数字证书。
- 证书包含两部分:
- 明文部分:服务端的公钥、域名、有效期、颁发者(CA信息)等。
- 签名部分:CA对证书明文内容的数字签名(由CA私钥生成)。
证书是公开的:服务端公钥、域名等信息本身就是明文存储在证书中,签名只是为了证明这些内容未被篡改。
- 客户端对证书的明文部分使用相同的哈希算法(如SHA-256)计算哈希值,得到一个新的哈希结果。
- 客户端使用CA的公钥(已预置在操作系统或浏览器的信任库中)解密证书的签名部分,得到CA当初生成的原始哈希值。
- 关键点:这里解密的是CA对哈希值的签名,而不是解密整个证书。
- 将客户端自己计算的哈希值与解密得到的原始哈希值进行比对:如果一致:说明证书内容未被篡改,且确实由该CA签发。如果不一致,证书可能被篡改或伪造,客户端会终止连接并提示风险(如浏览器显示“证书无效”)。
- 验证通过后,客户端直接从证书的明文部分获取服务端的公钥(无需从签名中还原,公钥本来就是明文存储的)。
- 该公钥将用于后续的密钥交换(如RSA加密Pre-Master Secret或ECDHE密钥协商)。

问题1:CA对服务端公钥是进行加密还是签名?
特性 | 签名(Signing) | 加密(Encryption) | |
目的 | 验证数据的完整性和来源真实性(防篡改、防伪造)。 | 保护数据的机密性(防止泄露)。 | |
操作方 | 用私钥生成签名,用公钥验证签名。 | 用公钥加密数据,用私钥解密数据。 | |
数学过程 | 对数据哈希值用私钥计算签名(非对称算法)。 | 用公钥加密原始数据(非对称算法或混合加密)。 | |
典型应用 | 数字证书、代码签名、区块链交易。 | HTTPS会话密钥交换、加密通信内容。 |
问题2: 为什么不用非对称加密传输所有数据?
为什么非对称加密比对称加密开销大?
- 数学运算复杂:非对称加密(如RSA、ECC)基于大数分解、离散对数等复杂数学问题,计算量远超对称加密(如AES)的简单位运算。
- 密钥长度差异:非对称加密需更长的密钥保证安全(如RSA-2048位),而对称加密仅需256位即可达到相同安全强度,处理的数据量更小。
- 功能定位不同:非对称加密专用于密钥交换和身份认证(如TLS握手),而对称加密专注高效数据加密,两者分工明确。
问题3: 如何防止 CA 被篡改?
预主密钥(Pre-Master Secret)
- 客户端生成预主密钥
2. 客户端加密并发送预主密钥
3. 服务端解密预主密钥
4. 生成主密钥(Master Secret)
- 输入顺序和标签固定:字符串 "master secret" 是固定的标签,确保会话密钥的生成过程一致。
- 结果唯一性:只要三个随机数相同,双方计算出的会话密钥必然相同。
TLS 四次握手流程(TLS1.2版本+RSA算法)


- 客户端发送 Client Hello:请求建立TLS连接,并发送支持的TLS协议版本、一个随机数、支持的加密方法列表。
- 服务端收到消息后,回应 Server Hello:确认使用的TLS版本、一个随机数、加密方法、服务器的公钥数字证书。
- 客户端收到服务端回应后,验证数字证书是否合法,如果证书受信任,或者用户接受该不受信的证书,客户端生成一个48字节的随机数作为预主密钥,并用证书中的提供的服务器公钥加密,发送给服务器。同时客户端还会发送握手结束通知,通知消息中会把之前所有内容数据做一个摘要,用来供服务端检验。
随机数 | 生成方 | 传递阶段 | 长度 | 作用 |
Client Random | 客户端 | Client Hello(明文) | 32字节 | 参与主密钥计算,防止重放攻击。 |
Server Random | 服务端 | Server Hello(明文) | 32字节 | 参与主密钥计算,增强随机性。 |
Pre-Master Secret | 客户端 | Client Key Exchange(加密) | 48字节 | 密钥材料的核心来源。 |
4. 服务端收到客户端的回复后,通过协商的加密算法将客户端发送过来的随机数解密出来,然后使用和客户端同样的算法,根据签名的三个随机数计算出会话密钥。同时,服务端也会发送握手结束通知,通知消息中会把之前所有内容的数据做一个摘要,用来供客户端检验。至此,整个握手阶段全部结束。
- 客户端发送Client Hello:支持的版本、随机数、加密套件
- 服务端发送Server Hello:确认版本、随机数、数字证书、选择的加密套件
- 客户端发送 Finished:计算主密钥 → 派生会话密钥 → 加密 Finished 消息(包含握手摘要)。
客户端验证证书:检查 CA 签名、域名、有效期等。若合法,生成 Pre-Master Secret,用服务器公钥加密后通过 Client Key Exchange 发送。
4. 服务端解密 Pre-Master Secret,生成相同主密钥和会话密钥,验证 Finished 后回复自己的 Finished。
- 无 RSA 密钥交换:Pre-Master Secret 通过 ECDHE 临时参数计算,无需加密传输。
- 合并消息:Server Hello 可能直接附带 Finished,减少交互次数(1-RTT)。
- 通过CA证书体系交换服务器的公钥来验证服务器的合法性。通过数字签名,确保数据的完整性,防止数据被篡改
- 通过非对称加密算法,交换用于对称加密的会话密钥,保证密钥的安全传输
- 通过对称加密算法,加密HTTP的数据进行正常的网络通信
密码套件
交互的包个数
步骤 | 方向 | 发送的消息类型 | 包数量 | |
第一次交互 | 客户端 → 服务端 | Client Hello | 1 个包 | |
第二次交互 | 服务端 → 客户端 | Server Hello、 Certificate、 Server Hello Done | 1 个包(合并发送) | |
第三次交互 | 客户端 → 服务端 | Client Key Exchange、Change Cipher Spec、Finished | 1 个包(合并发送) | |
第四次交互 | 服务端 → 客户端 | Change Cipher Spec、Finished | 1 个包(合并发送) |
合并发送:TLS 允许将多个消息合并到一个 TCP 包中发送(如服务端将 Server Hello、Certificate、Server Hello Done 合并为 1 个包)。
消息类型
1. Client Hello
- 发送方:客户端
- 作用:发起 TLS 握手,声明支持的加密参数。
- 包含内容:
- TLS 版本(如 TLS 1.2)。
- 随机数(Client Random,32 字节)。
- 支持的加密套件列表(如 AES256-GCM-SHA384)。
- 其他扩展(如 SNI 域名、支持的椭圆曲线等)。
2. Server Hello
- 发送方:服务端
- 作用:确认加密参数,返回协商结果。
- 包含内容:
- 选择的 TLS 版本和加密套件。
- 随机数(Server Random,32 字节)。
- 会话 ID(用于会话恢复)。
- 其他扩展(如选中的椭圆曲线)。
3. Certificate(证明)
- 发送方:服务端
- 作用:向客户端发送服务器的数字证书,证明身份。
- 包含内容:
- 服务器的公钥证书链(从叶子证书到中间 CA,可能包含根证书)。
- 证书中的公钥用于后续密钥交换(如 RSA 公钥加密 Pre-Master Secret)。
- RSA 密钥交换:客户端用该公钥加密 Pre-Master Secret。
- ECDHE 密钥交换:公钥仅用于验证签名(若证书使用 RSA/ECDSA 签名),密钥交换本身通过临时椭圆曲线参数完成。
4. Server Hello Done
- 发送方:服务端
- 作用:通知客户端“服务端握手消息已发送完毕”。
- 关键点:
- 这是一个空消息,仅作为标志位。
- 客户端收到后开始验证证书并准备密钥交换。
5. Client Key Exchange(客户端密钥交换)
- 发送方:客户端
- 作用:传递密钥交换所需信息(具体内容取决于加密套件)。
- 典型场景:
- RSA 密钥交换:发送用服务器公钥加密的 Pre-Master Secret(48 字节随机数)。
- ECDHE 密钥交换:发送客户端的临时椭圆曲线公钥参数。
6. Change Cipher Spec(更改密码规范)
- 发送方:客户端
- 作用:通知服务端“后续消息将使用协商的会话密钥加密”。
- 关键点:
- 这是一个独立于握手协议的消息(属于 Change Cipher Spec 协议)。
- 之后客户端发送的 Finished 消息会被加密。
7. Finished
- 发送方:客户端
- 作用:验证握手过程完整性,确认密钥正确性。
- 包含内容:
- 所有之前握手消息的摘要(HMAC 值)。
- 首次加密消息:用协商的会话密钥加密。
- 安全意义:若服务端能解密并验证此消息,说明密钥一致且握手未被篡改。
8. Change Cipher Spec
- 发送方:服务端
- 作用:通知客户端“后续消息将使用会话密钥加密”。
- 对称性:与服务端的 Finished 消息配套出现。
9. Finished
- 发送方:服务端
- 作用:服务端对握手完整性的最终确认。
- 包含内容:
- 所有握手消息的摘要(HMAC)。
- 用会话密钥加密,客户端解密验证后完成握手。
TLS是几次握手(不同版本)



RSA 和 ECDHE 的区别(密钥交换算法)
密钥交换算法的核心目标是:让通信双方在不安全的网络中,安全地协商出一个共享的密钥(通常用于后续对称加密)
握手流程对比
RSA 密钥交换(TLS 1.2 示例)
- 客户端发送 ClientHello(支持的密码套件,如TLS_RSA_WITH_AES_128_GCM_SHA256)。
- 服务器回复 ServerHello + RSA 公钥证书。
- 客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送。
- 服务器用 RSA 私钥解密获取预主密钥。
- 双方根据预主密钥生成会话密钥。
- 若服务器私钥泄露,所有历史通信可被解密(无前向保密性)。
- RSA 加解密计算成本高(尤其是 2048-bit 以上密钥)。
ECDHE 密钥交换(TLS 1.2/1.3 示例)
- 客户端发送 ClientHello(支持 ECDHE 套件,如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)。
- 服务器回复 ServerHello + 证书 + ECDHE 参数(椭圆曲线、临时公钥)。
- 客户端生成临时 ECDHE 公钥,发送给服务器。
- 双方通过椭圆曲线迪菲-赫尔曼算法计算共享密钥(无需加密传输)。
- 基于共享密钥生成会话密钥。
- 前向保密性:临时密钥(Ephemeral)用完即弃,即使服务器私钥泄露,历史会话仍安全。
- 性能更高:256-bit ECC 安全性 ≈ 3072-bit RSA,但计算量更小。


总结
特性 | RSA 密钥交换 | ECDHE 密钥交换 |
密钥交换原理 | 客户端用服务器公钥加密预主密钥 | 通过椭圆曲线迪菲-赫尔曼临时交换生成共享密钥 |
前向保密性 | 不支持 | 支持(每次会话生成临时密钥) |
计算性能 | 服务器解密开销大(非对称计算) | 更快(椭圆曲线计算效率高于 RSA) |
密钥长度安全性 | 2048-bit RSA ≈ 112-bit 安全性 | 256-bit ECDHE ≈ 128-bit 安全性 |
TLS 1.3 支持 | 已废弃 | 唯一支持的密钥交换方式 |
前向保密性(Forward Secrecy):RSA:预主密钥由服务器公钥加密,一旦服务端的私钥泄漏了,过去被第三方截获的所有 TLS 通讯密文都会被破解。为了解决这个问题,后面就出现了 ECDHE 密钥协商算法,我们现在大多数网站使用的正是 ECDHE 密钥协商算法ECDHE:每次会话生成临时密钥,共享密钥不依赖服务器私钥,即使私钥泄露,历史会话仍安全密钥交换:RSA:用证书公钥加密 Pre-Master Secret。ECDHE:证书公钥仅用于身份认证,临时密钥单独交换。
TLS 1.3 版本的变化
- 废除 RSA 密钥交换:TLS 1.3 仅支持前向保密的密钥交换(如 ECDHE)。
- 简化握手:ECDHE 参数在首轮交互中传递,减少 RTT(1-RTT 握手)。