什么是 HTTP?
HTTP(HyperText Transfer Protocol,超文本传输协议)是一个基于请求-响应模型的应用层协议,运行在 TCP 之上,默认端口 80。1990 年,HTTP 成为 WWW 的支撑协议。
HTTP 是无状态协议——服务器不保存任何关于客户端历史请求的信息。这个设计简化了服务器实现:有状态协议需要维护历史信息,一旦客户端或服务器发生故障,状态不一致的修复代价极高。
HTTP 通信过程
HTTP 以 TCP 作为底层协议,通信流程如下:
- 服务器在 80 端口监听连接请求
- 浏览器发起到服务器的 TCP 连接(创建 Socket)
- 服务器接受 TCP 连接
- 浏览器(HTTP 客户端)与 Web 服务器(HTTP 服务器)交换 HTTP 报文
- 关闭 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 均无察觉。
即使对公钥本身加密,也无法解决信任问题:谁来保证加密公钥所用的密钥是可信的?
数字签名
数字签名解决两个问题:证明身份 + 保证数据未被篡改。
签名流程:
- Bob 生成公私钥对,公钥公开,私钥自留
- 发送时:对数据计算哈希摘要 → 用私钥加密摘要 → 将原始数据 + 签名一同发出
- Alice 收到后:用 Bob 的公钥解密签名得到摘要A → 自行对数据计算摘要B → 比对 A 与 B
若 A == B,则数据未被篡改,且确实由 Bob(私钥持有者)发出。
为什么无法伪造?
- 篡改数据:摘要对比失败
- 替换签名:用 Bob 公钥解密会得到乱码
- 极端情况:攻击者用自己的公私钥伪造一套数据 + 签名,Alice 将无法发现——因为 Alice 无法确认网络上哪个公钥是真正属于 Bob 的
这是一个先有鸡还是先有蛋的问题:要验证身份,必须先有可信的信任根。
数字证书与 CA
为解决公钥信任问题,引入证书颁发机构(CA,Certificate Authority)——默认受信任的第三方。
证书 = 持有者公钥 + CA 的数字签名
证书认证流程:
- Bob 向 CA 提交个人信息和公钥,CA 核实身份
- CA 用自己的私钥对「Bob 的身份信息 + 公钥」进行数字签名,生成证书
- Alice 想与 Bob 通信,获取 Bob 的证书
- Alice 用系统预置的 CA 公钥验证证书签名,确认证书未被篡改
- Alice 取出证书中的 Bob 公钥,开始安全通信
系统/浏览器出厂时预装了受信任 CA 的根证书(含其公钥),从而终结了信任循环——CA 公钥的可信性由操作系统/浏览器厂商背书。
SSL/TLS 完整握手
一句话总结:SSL/TLS = 数字证书(身份验证)+ RSA 密钥交换 + 对称加密(数据传输)
由于 RSA 比 AES 慢得多,实际通信采用混合加密:
- 接收方生成 RSA 密钥对,将公钥通过证书发给发送方
- 发送方生成随机的对称密钥(AES Key),用 RSA 公钥加密后传给接收方
- 接收方用 RSA 私钥解密,得到 AES Key
- 双方此后用 AES Key 进行所有数据的加解密传输
私钥签名在此过程中用于验证身份合法性(验签),防止中间人冒充服务器。
中间人攻击在完整的证书体系下几乎没有技术空间,现实中的攻击手段已转向社会工程学——例如预装非正规 CA 证书的山寨浏览器,这类证书可使攻击者对受害者实施合法的中间人攻击。
HTTP vs HTTPS
| 维度 | HTTP | HTTPS |
|---|---|---|
| 默认端口 | 80 | 443 |
| URL 前缀 | http:// | https:// |
| 传输内容 | 明文 | 加密(对称加密,密钥经非对称加密交换) |
| 身份验证 | 无 | 有(数字证书) |
| 服务器开销 | 低 | 较高(SSL/TLS 握手 + 加解密运算) |