技术知识文章集合TECHNICAL ARCHIVE · 457 DOCUMENTS

显示模式

登录
ARCHIVE DOCUMENTNET

深入理解 HTTPS 工作原理

所属馆藏
NET Protocol
文件格式
Markdown
原始路径
NET Protocol/25-深入理解HTTPS工作原理
本文目录11 个章节
  1. 一、什么是 HTTPS?
  2. 二、为什么需要 HTTPS?
  3. 三、HTTPS 如何解决 HTTP 的问题?
  4. 四、数字签名如何保证完整性?
  5. 五、数字证书和 CA
  6. 六、HTTPS 工作流程
  7. 七、HTTP 与 HTTPS 的区别
  8. 八、为什么仍然需要考虑 HTTPS 的部署成本?
  9. 九、HTTPS 的安全边界
  10. 小结
  11. 参考资料

深入理解 HTTPS 工作原理

Category(分类): NET Protocol Status: 优

近年来,HTTPS 已经成为公网 Web 服务的主流。浏览器、搜索引擎、CA 机构、CDN 和云服务共同推动了 HTTPS 的普及,但理解 HTTPS 不能只停留在“有证书、数据被加密”这一层面。

读完本文,希望你能明白:

  • HTTP 通信存在什么问题;
  • HTTPS 如何改进 HTTP 的机密性、完整性和身份认证问题;
  • 对称加密、非对称密码学、数字签名和证书分别解决什么问题;
  • TLS 1.3 的 HTTPS 握手大致如何工作;
  • HTTPS 的能力边界和部署成本是什么。

想阅读更多文章,可以参考GitHub 博客

一、什么是 HTTPS?

HTTPS 更准确的表达是:

HTTPS = HTTP over TLS

HTTPS 不是一种完全替代 HTTP 语义的新应用协议,而是将 HTTP 消息交给 TLS 保护,再通过传输层发送。SSL 是 TLS 的前身,SSL 2.0 和 SSL 3.0 已经废弃,现代 HTTPS 主要使用 TLS 1.2 或 TLS 1.3。

对于 HTTP/1.1 和 HTTP/2,TLS 通常运行在 TCP 之上;HTTP/3 则运行在 QUIC 之上,QUIC 使用 UDP 作为底层传输。

HTTPS 主要提供:

  1. 机密性:防止传输中的第三方直接读取应用数据;
  2. 完整性:发现传输内容是否被篡改;
  3. 身份认证:通过证书和信任链验证服务器身份;
  4. 可选的客户端认证:在双向 TLS 等场景中验证客户端证书。

使用 HTTPS 时,URL 通常使用 https://,默认端口通常为 443。端口只是约定,HTTPS 也可以运行在其他端口上。

HTTPS 概览图

浏览器界面会根据 HTTPS 证书和连接状态显示不同的安全提示,但地址栏中的锁形图标只表示连接满足浏览器的 TLS 验证条件,不代表网站业务一定可信,也不代表客户端和服务器本身没有被入侵。

二、为什么需要 HTTPS?

HTTP 本身不提供加密、完整性保护和通信方身份认证,因此在不可信网络中可能出现以下问题。

1. 通信使用明文,内容可能被窃听

HTTP 报文通常以明文传输,网络中的攻击者、恶意 Wi-Fi、被入侵的路由设备或代理可能读取请求和响应内容,例如:

  • 登录信息;
  • Cookie;
  • 个人资料;
  • 订单和支付相关数据;
  • 页面返回的业务内容。

HTTPS 通过 TLS 记录层加密保护应用数据,但 IP 地址、连接时间、流量大小等部分元数据仍可能被观察到。

2. 缺少完整性保护,报文可能被篡改

HTTP 没有为报文提供密码学完整性校验。攻击者可能在请求或响应经过网络节点时修改内容,例如替换脚本、插入广告、修改下载文件或改变请求参数。

HTTPS 使用 TLS 的 AEAD 算法和记录校验机制检测传输内容是否被篡改。这里的完整性保护不是简单地对整段 HTTP 报文做一个普通 MD5,而是由 TLS 密钥和认证加密算法共同完成。

3. 不验证通信方身份,可能遭遇伪装

HTTP 本身不会验证客户端连接的服务器是否就是用户想访问的服务器。攻击者可能伪造网站、劫持 DNS 或控制中间网络,让用户连接到恶意服务器。

HTTPS 通过 X.509 证书、CA 信任链、域名匹配和 TLS 握手签名验证服务器身份,从而降低中间人伪装风险。

HTTPS 的安全性建立在以下前提上:

  • 客户端信任库没有被恶意修改;
  • 证书校验没有被关闭;
  • 域名、有效期和证书用途验证通过;
  • 服务端私钥没有泄露;
  • 客户端和服务器端点本身没有被入侵。

三、HTTPS 如何解决 HTTP 的问题?

HTTPS 的安全能力主要由 TLS 提供。可以把协议关系理解为:

HTTP 应用数据
    ↓
TLS 加密、完整性和握手认证
    ↓
TCP(HTTP/1.1、HTTP/2)或 QUIC(HTTP/3)

HTTP 与 TLS 的协议层关系

TLS 握手负责协商版本、密码套件和会话密钥,并认证服务器;TLS 记录层负责保护后续的应用数据。

HTTPS 提供的安全能力

现代 TLS 通常涉及以下密码学机制:

  • 对称加密和 AEAD:高效保护大量应用数据;
  • 非对称密码学:用于密钥协商、身份认证或数字签名;
  • 哈希函数和 HKDF:用于摘要、握手校验和密钥派生;
  • X.509 证书和 CA 签名:把服务器身份与公钥绑定。

HTTPS 中使用的密码学机制

1. 对称加密

对称加密使用同一个秘密密钥进行加密和解密。它的计算效率通常较高,适合保护大量应用数据。

问题在于:通信双方必须安全地获得同一个密钥。如果通过明文网络直接传输密钥,监听者就可能同时获得密钥和密文;如果使用另一个没有安全传输渠道的密钥加密,又会遇到新的密钥分发问题。

TLS 记录层常使用 AES-GCM 或 ChaCha20-Poly1305 等 AEAD 算法。AEAD 不仅提供机密性,还能检测密文、序列号和关联数据是否被篡改。

2. 非对称密码学

非对称密码学使用一对公钥和私钥:

  • 公钥可以公开;
  • 私钥必须由持有者妥善保管;
  • 公钥加密、私钥解密可以用于机密性;
  • 私钥签名、公钥验证用于身份认证和完整性。

非对称加密示意图

非对称密码学解决了密钥分发的一部分问题,但它本身不能证明某个公钥属于目标服务器。如果攻击者把服务器公钥替换成自己的公钥,客户端仍可能使用错误的公钥加密数据。因此,公钥必须通过证书和可信任的身份验证机制进行绑定。

非对称运算通常比对称加密开销更大,所以 TLS 通常只在握手阶段使用非对称密码学,后续应用数据使用对称 AEAD 加密。

3. 混合加密和密钥协商

历史上的部分 TLS 1.2 连接可以使用 RSA 密钥交换:客户端生成 premaster secret,用服务器证书中的 RSA 公钥加密后发送,服务器用私钥解密,再由双方派生会话密钥。

但这种方式不是现代 TLS 1.3 的标准流程,而且不具备理想的前向保密性。现代 TLS 1.3 通常使用临时 ECDHE:

  1. 客户端和服务器交换临时公钥参数;
  2. 双方分别计算相同的共享秘密;
  3. 使用 HKDF 从共享秘密和握手上下文派生会话密钥;
  4. 使用会话密钥保护后续 TLS 记录。

最终的应用数据密钥通常不会直接通过服务器证书公钥传输。临时 ECDHE 还可以提供前向保密:即使服务器长期私钥日后泄露,也不能直接解密过去捕获的 TLS 1.3 1-RTT 会话数据。

四、数字签名如何保证完整性?

数字签名主要用于证明消息或证书内容确实由某个私钥持有者签署,并且签署后没有被修改。它不负责隐藏消息内容。

1. 生成数字签名

一般流程是:

  1. 对待签名内容计算密码学哈希摘要;
  2. 使用签名者的私钥生成数字签名;
  3. 将原文和签名一起发送。

数字签名生成过程

“使用私钥加密摘要”只是早期教材中的类比。更准确的说法是“使用私钥生成签名”,因为不同签名算法的数学过程并不等同于普通加密。

2. 验证数字签名

接收者通常会:

  1. 使用签名算法和签名者公钥验证签名;
  2. 对收到的原文重新计算摘要;
  3. 确认签名对应的内容和公钥身份都符合预期。

数字签名验证过程

数字签名能证明内容没有被修改,也能证明签名由对应私钥生成,但前提是接收者已经可信地获得了正确的公钥。如果攻击者替换公钥,签名验证就失去了身份意义,这正是数字证书和 CA 要解决的问题。

五、数字证书和 CA

数字证书认证机构(Certificate Authority,CA)是客户端和服务器都信任的第三方。CA 的作用是通过验证域名控制权或组织身份,把服务器身份、公钥和签名绑定在一起。

CA 与数字证书关系示意图

CA 签发证书的一般过程如下:

  1. 服务器运营者生成密钥对,并向 CA 提交证书申请;
  2. CA 验证申请者对域名的控制权,或根据证书类型验证组织身份;
  3. CA 生成 X.509 证书内容,包含服务器公钥、SAN、有效期、签发者、序列号和用途等字段;
  4. CA 对待签名证书内容计算摘要并生成数字签名;
  5. 客户端收到终端证书和可能的中间证书;
  6. 客户端根据本地信任库验证证书链和 CA 签名。

客户端通常会检查:

  • 证书链是否连接到受信任的根 CA;
  • 当前访问的域名是否匹配 SAN;
  • 证书是否在有效期内;
  • 证书用途是否包括服务器认证;
  • 证书是否违反本地安全策略;
  • 是否能够通过 CRL、OCSP 或其他机制获得撤销信息。

服务器证书中的签名是 CA 使用 CA 私钥生成的;服务器自己的私钥并不是 CA 的私钥。TLS 1.3 握手中,服务器还会使用自己的私钥对握手 transcript 进行 CertificateVerify 签名,以证明自己确实持有证书对应的私钥。

客户端信任的是自己的信任库,不一定包含世界上所有 CA。服务器一般发送终端证书和中间证书,根证书通常已经由操作系统、浏览器或应用预置。

六、HTTPS 工作流程

下面先介绍现代 TLS 1.3 的简化流程。真实握手还会受到会话恢复、客户端证书、代理、密码套件和协议扩展影响。

HTTPS 握手流程图

1. 连接和客户端问候

客户端先解析域名并建立 TCP 连接;如果使用 HTTP/3,则建立 QUIC 连接。随后客户端发送 ClientHello,其中通常包含:

  • 支持的 TLS 版本;
  • 密码套件;
  • 客户端随机数;
  • ECDHE 密钥交换参数;
  • ALPN 等协议协商信息。

HTTPS 默认使用 443 端口,但端口本身不是安全性的来源。

2. 服务端响应和证书

服务端返回 ServerHello,选择 TLS 版本、密码套件和密钥交换参数,然后发送:

  • 服务器证书链;
  • CertificateVerify 握手签名;
  • Finished 等握手验证信息。

客户端验证证书链、SAN、有效期、证书用途,并验证服务端的握手签名。

3. 双方派生会话密钥

客户端和服务端使用各自的临时密钥参数计算相同的 ECDHE 共享秘密,再通过 HKDF 派生握手密钥和应用数据密钥。最终双方都拥有相同的 TLS 记录层密钥,但网络监听者无法仅凭捕获的握手报文计算出该密钥。

4. 加密传输 HTTP 数据

握手完成后:

  • 客户端把 HTTP 请求交给 TLS 记录层加密并发送;
  • 服务端解密并交给 HTTP 应用层处理;
  • 服务端把 HTTP 响应交给 TLS 加密后返回;
  • 客户端验证完整性并解密得到 HTTP 响应。
客户端                                      服务端
  | -------- ClientHello -----------------> |
  | <------- ServerHello + Certificate ---- |
  | <------- CertificateVerify + Finished - |
  | -------- Finished -------------------> |
  | <====== 加密的 HTTP Application Data ======> |

5. 历史上的 TLS 1.2 RSA 密钥交换

为了理解旧资料中的“客户端生成对称密钥并用服务器公钥加密”,可以把它看成 TLS 1.2 RSA 密钥交换的简化描述:

  1. 客户端生成 premaster secret;
  2. 使用服务器证书中的 RSA 公钥加密;
  3. 服务器使用对应私钥解密;
  4. 双方从 premaster secret 派生会话密钥。

这种方式不能代表 TLS 1.3,也不应在现代文章中作为默认 HTTPS 流程。现代 TLS 1.3 使用 ECDHE 密钥协商,不直接传输最终对称密钥。

七、HTTP 与 HTTPS 的区别

HTTP 与 HTTPS 对比示意图

  • HTTP 不提供传输层加密、完整性保护和服务器身份认证;
  • HTTPS 使用 TLS 保护 HTTP 通信;
  • HTTP/1.1 和 HTTP/2 通常使用 TCP + TLS;
  • HTTP/3 使用 QUIC + TLS;
  • HTTP 默认端口通常是 80,HTTPS 默认端口通常是 443;
  • HTTPS 通常需要有效证书,HTTP 不需要;
  • HTTPS 可以防止传输过程中的窃听和篡改,但不能代替应用层认证和授权;
  • HTTPS 不会自动解决 XSS、CSRF、SQL 注入或服务器漏洞。

HTTPS 和 HTTP 都属于应用层协议语境,不能说“HTTPS 基于传输层而 HTTP 基于应用层”。TLS 位于 HTTP 和传输层之间。

八、为什么仍然需要考虑 HTTPS 的部署成本?

现在公网网站普遍建议使用 HTTPS,且 Let's Encrypt 等机构提供免费证书,因此“证书必须购买”已经过时。仍然需要考虑的成本主要包括:

  • 证书申请、续期和自动化部署;
  • 多域名、通配符和证书链管理;
  • 负载均衡器、CDN 和源站之间的 TLS 配置;
  • 旧客户端的协议和密码套件兼容;
  • 证书轮换、私钥保护和监控;
  • 混合内容、重定向和 Cookie 的 Secure 配置。

HTTPS 会增加一定的握手和加密计算开销,但现代系统可以通过以下方式降低影响:

  • TLS 1.3;
  • 会话恢复;
  • TCP/TLS 连接复用;
  • HTTP/2 或 HTTP/3;
  • CDN 或负载均衡器进行 TLS 终止;
  • CPU 硬件加速和高效的 AEAD 算法。

实际性能取决于网络延迟、连接复用、缓存、服务器实现和页面资源数量,不能简单说 HTTPS 一定比 HTTP 慢。

HTTPS 部署和性能示意图

九、HTTPS 的安全边界

HTTPS 主要保护客户端与 TLS 终止点之间的传输过程。如果 CDN、负载均衡器或反向代理负责 TLS 终止,那么从该设备到后端是否继续使用 TLS,需要根据部署方式单独配置。

HTTPS 不能阻止:

  • 服务器端已经被入侵;
  • 客户端已经被恶意软件控制;
  • 用户安装了攻击者控制的根证书;
  • 应用自身存在 XSS、CSRF 或权限校验漏洞;
  • 用户把密码主动提交给钓鱼网站。

因此,HTTPS 是 Web 安全的重要基础,但不是完整的应用安全方案。

小结

本文介绍了 HTTPS 的核心原理:

  • HTTP 本身没有机密性、完整性和身份认证;
  • 对称加密适合保护大量应用数据,但需要解决密钥协商;
  • 非对称密码学可以用于密钥协商和数字签名,但计算成本较高;
  • 数字证书把服务器身份与公钥绑定,CA 通过数字签名建立信任链;
  • TLS 1.3 通常使用 ECDHE 协商共享秘密,再使用 HKDF 派生会话密钥;
  • 后续 HTTP 数据使用 AES-GCM 或 ChaCha20-Poly1305 等 AEAD 算法保护;
  • HTTPS 保护传输过程,但不能替代应用层认证、授权和安全编码。

参考资料

457 DOCUMENTS · 10 COLLECTIONS
ARCHIVE SEARCH457 篇文章

SEARCH GUIDE

输入关键词开始搜索

支持搜索文章标题、所属分类和原始文档路径。

按分类浏览

10 COLLECTIONS