什么是 HTTP?

HTTP(HyperText Transfer Protocol,超文本传输协议)是一个基于请求-响应模型的应用层协议,运行在 TCP 之上,默认端口 80。1990 年,HTTP 成为 WWW 的支撑协议。

HTTP 是无状态协议——服务器不保存任何关于客户端历史请求的信息。这个设计简化了服务器实现:有状态协议需要维护历史信息,一旦客户端或服务器发生故障,状态不一致的修复代价极高。

HTTP 通信过程

HTTP 以 TCP 作为底层协议,通信流程如下:

  1. 服务器在 80 端口监听连接请求
  2. 浏览器发起到服务器的 TCP 连接(创建 Socket)
  3. 服务器接受 TCP 连接
  4. 浏览器(HTTP 客户端)与 Web 服务器(HTTP 服务器)交换 HTTP 报文
  5. 关闭 TCP 连接

HTTPS

背景——HTTP 的缺点

HTTP 明文传输,从你的路由器、运营商到目标服务器,链路上每一跳都是可读的明文。中间人可以任意截获、篡改数据。

典型案例:部分运营商会向 HTTP 页面注入浮动广告;微博全站 HTTPS 化之前,有人通过截获 Cookie 冒用用户身份关注僵尸号、给营销号点赞——无需破解密码,只需复用 Cookie 即可。

对 HTTPS 网站,中间人只能看到密文,无从篡改。

HTTPS 的核心——SSL/TLS 协议

HTTPS = HTTP + SSL/TLS。SSL/TLS 运行在 TCP 之上,对 HTTP 报文进行加密,解决了明文传输问题。

SSL 和 TLS 的区别

SSL 和 TLS 没有太大的区别。 —— 摘自 JavaGuide

SSL(Secure Sockets Layer)首次公开发布是 3.0 版本(1996 年),1.0 从未面世,2.0 存在严重缺陷(DROWN 漏洞)。1999 年,SSL 3.0 升级后更名为 TLS 1.0。TLS 是 SSL 的继承者,但习惯上仍将核心加密协议统称为 SSL/TLS。

SSL/TLS 的工作原理

理解 SSL/TLS,需要先掌握三类基础算法。

散列算法(哈希)

散列算法是单向算法——对任意长度输入产生固定长度输出(摘要),且不可逆推原文。

用途:验证数据完整性。发送方对数据计算摘要并随数据一同发出,接收方重新计算摘要对比,若一致则数据未被篡改。

常用算法:MD5、SHA-1、HMAC

注意:散列算法不是加密算法,因为结果不可逆,无法用于解密。

加密算法

对称加密

收发双方使用相同密钥,加解密速度快,运算开销小。

  • 常用算法:DES、3DES、AES
  • 缺陷:密钥本身需要通过网络传递,存在被中间人截获的风险
非对称加密

使用一对密钥(公钥 + 私钥),从公钥无法推导出私钥。

操作使用的密钥含义
加密公钥加密只有私钥持有者能解密
解密私钥解密—
签名私钥加密摘要证明身份,不可抵赖
验签公钥解密签名任何人都可验证
  • 常用算法:RSA、ECC
  • 缺陷:运算开销大;公钥在网络传输时存在被伪造的风险(中间人攻击)

中间人攻击示意:

C 想与 S 通信,需要先获得 S 的公钥。若 S 直接在网络上发送公钥(未经认证),攻击者 A 可以冒充 S,将自己伪造的公钥发给 C。此后 C 用假公钥加密的数据,A 都可以用自己的私钥解密,完成窃听——C 和 S 均无察觉。

即使对公钥本身加密,也无法解决信任问题:谁来保证加密公钥所用的密钥是可信的?

数字签名

数字签名解决两个问题:证明身份 + 保证数据未被篡改。

签名流程:

  1. Bob 生成公私钥对,公钥公开,私钥自留
  2. 发送时:对数据计算哈希摘要 → 用私钥加密摘要 → 将原始数据 + 签名一同发出
  3. Alice 收到后:用 Bob 的公钥解密签名得到摘要A → 自行对数据计算摘要B → 比对 A 与 B

若 A == B,则数据未被篡改,且确实由 Bob(私钥持有者)发出。

为什么无法伪造?

  • 篡改数据:摘要对比失败
  • 替换签名:用 Bob 公钥解密会得到乱码
  • 极端情况:攻击者用自己的公私钥伪造一套数据 + 签名,Alice 将无法发现——因为 Alice 无法确认网络上哪个公钥是真正属于 Bob 的

这是一个先有鸡还是先有蛋的问题:要验证身份,必须先有可信的信任根。

数字证书与 CA

为解决公钥信任问题,引入证书颁发机构(CA,Certificate Authority)——默认受信任的第三方。

证书 = 持有者公钥 + CA 的数字签名

证书认证流程:

  1. Bob 向 CA 提交个人信息和公钥,CA 核实身份
  2. CA 用自己的私钥对「Bob 的身份信息 + 公钥」进行数字签名,生成证书
  3. Alice 想与 Bob 通信,获取 Bob 的证书
  4. Alice 用系统预置的 CA 公钥验证证书签名,确认证书未被篡改
  5. Alice 取出证书中的 Bob 公钥,开始安全通信

系统/浏览器出厂时预装了受信任 CA 的根证书(含其公钥),从而终结了信任循环——CA 公钥的可信性由操作系统/浏览器厂商背书。

SSL/TLS 完整握手

一句话总结:SSL/TLS = 数字证书(身份验证)+ RSA 密钥交换 + 对称加密(数据传输)

由于 RSA 比 AES 慢得多,实际通信采用混合加密:

  1. 接收方生成 RSA 密钥对,将公钥通过证书发给发送方
  2. 发送方生成随机的对称密钥(AES Key),用 RSA 公钥加密后传给接收方
  3. 接收方用 RSA 私钥解密,得到 AES Key
  4. 双方此后用 AES Key 进行所有数据的加解密传输

私钥签名在此过程中用于验证身份合法性(验签),防止中间人冒充服务器。

中间人攻击在完整的证书体系下几乎没有技术空间,现实中的攻击手段已转向社会工程学——例如预装非正规 CA 证书的山寨浏览器,这类证书可使攻击者对受害者实施合法的中间人攻击。

HTTP vs HTTPS

维度HTTPHTTPS
默认端口80443
URL 前缀http://https://
传输内容明文加密(对称加密,密钥经非对称加密交换)
身份验证无有(数字证书)
服务器开销低较高(SSL/TLS 握手 + 加解密运算)