HTTPS 入门:它到底解决了什么问题?

HTTPS 不是锦上添花,而是底线。

我记得 2015 年带过一个电商项目,上线第一天就被安全团队叫停——所有登录密码明文传输。那时候还没有 HTTPS 强制要求,但用户敏感信息直接暴露在网络里,跟裸奔没区别。从那天起,我再也没做过不加密的线上系统。

HTTPS 全称 HTTP over SSL/TLS,简单说就是在 HTTP 外面套了一层加密隧道。它解决的核心问题有三个:窃听(中间人能看到内容)、篡改(数据在传输中被改掉)、冒充(你访问的服务器不是你以为的那个)。

一、HTTP 的三大“裸奔”问题

咱们先看 HTTP 是怎么“裸”的。HTTP 协议本身不加密,所有请求和响应都以明文在网络中传输。你想想看,Wi-Fi 蹭网、运营商缓存、甚至同一个交换机下的恶意软件,都能轻松抓包。

  • 窃听(Eavesdropping):任何中间节点都能读你的数据包。密码、支付卡号、聊天记录一览无余。
  • 篡改(Tampering):攻击者可以在路由节点上修改数据,比如插入广告、替换下载文件、甚至植入木马。
  • 冒充(Impersonation):DNS 劫持或 ARP 欺骗,让你连到假的服务器,交出敏感信息。

实际案例:运营商劫持 HTTP 页面注入广告,十几年前非常普遍。我现在做项目,只要涉及用户登录或支付,一律上 HTTPS,连静态资源都不放过。

二、SSL/TLS 发展史:从实验室到标配

说白了,SSL/TLS 就是给 HTTP 穿上的防弹衣。我从 1.0 到 1.3 简单梳理一下,重点看咱们现在该用什么。

协议版本 发布年份 关键特点 当前状态
SSL 1.0 未公开 网景内部版本,有严重安全漏洞,从未公开发布 废弃
SSL 2.0 1995 第一个公开版本,但存在弱点(如MD5 MAC、弱密钥) 废弃(RFC 6176)
SSL 3.0 1996 广泛使用,但2014年POODLE攻击后被认为不安全 废弃(RFC 7568)
TLS 1.0 1999 实际上是SSL 3.0的升级,改名以淡化网景商标 建议禁用(已过时)
TLS 1.1 2006 增加了CBC保护、IV显式传递等改进 建议禁用
TLS 1.2 2008 当前主流标准,支持AEAD、GCM、ECDHE等强密码套件 推荐使用
TLS 1.3 2018 握手更快(1-RTT)、移除不安全算法(RC4、3DES等)、前向安全默认 强烈推荐

我曾经在维护一个老系统时,发现服务器只支持 SSL 3.0,而用户都用 Chrome 70+ 了。浏览器直接拒绝连接——全线瘫痪。最后强制升级到 TLS 1.2 才解决。所以别贪图兼容性保留旧版本,早升级早省心。

为什么 TLS 1.3 现在最香?握手从 2-RTT 降到了 1-RTT(甚至 0-RTT 恢复),而且强制前向安全。你想想看,即使私钥泄露了,之前的会话也无法被解密。我个人习惯,新项目一律只开 TLS 1.2 + 1.3,关掉所有老旧协议。

三、HTTPS 与 HTTP 对比:一张表看懂差异

对比维度 HTTP HTTPS
默认端口 80 443
加密方式 明文 SSL/TLS 加密 (对称 + 非对称混合加密)
身份验证 无(任何人都可以冒充服务器) 通过 CA 签发的数字证书验证服务器身份
数据完整性 无保护(可被篡改) 消息认证码(MAC)保证数据未被篡改
性能开销 低(无加密握手) 略有增加(TLS 握手 + 加密运算),但可通过会话复用、OCSP Stapling 优化
SEO 影响 搜索引擎降低权重(Google 已明确 HTTPS 为排名信号) 提升搜索排名,浏览器地址栏显示小锁(安全标识)
浏览器标记 地址栏显示“不安全”(Chrome 56+ 开始标记) 显示绿色锁图标(EV 证书显示公司名)

避坑:很多人以为 HTTPS 会带来巨大的性能损耗,其实 TLS 1.3 握手仅需一次往返,加密运算在硬件加速下可以做到亚毫秒级。我在公司内部压测过,纯静态资源切换 HTTPS 后 QPS 下降不到 5%,完全可以接受。

HTTP vs HTTPS 通信对比 HTTP 明文传输 没有加密,数据可被窃听、篡改 HTTPS 加密传输 TLS 加密,数据完整且不可抵赖 中间人攻击 可轻松读取和修改明文 证书验证 + 加密 中间人无法伪造证书 ⚠ 无身份验证:可冒充服务器 ⚠ 数据可被中间人任意篡改 ⚠ 密码、cookie 明文暴露 ✓ CA 数字证书验证服务器身份 ✓ TLS 消息认证码保证完整性 ✓ 对称加密保护数据机密性 HTTPS = HTTP + TLS + 证书 + 强密码套件 本质是把明文通道升级为安全通道

四、HTTPS 到底做了什么?

看完对比图,你应该有了直观印象。HTTPS 的核心动作其实就三件事:握手协商密钥、证书验证、加密传输。

  1. 客户端发起 ClientHello:告诉服务器支持的 TLS 版本、密码套件列表、随机数等。
  2. 服务器回复 ServerHello:选定密码套件和协议版本,并发送自己的数字证书(包含公钥)。
  3. 客户端验证证书:检查证书是否由受信任的 CA 签发、域名是否匹配、是否在有效期内、是否被吊销。
  4. 密钥交换:使用非对称加密(如 ECDHE)协商出对称密钥,后续通信全部用对称加密。
  5. 加密传输:应用数据分段、加MAC、加密、发送;接收端解密、验证、重组。

我记得刚开始调试 HTTPS 时,遇到一个奇怪问题:服务端证书明明没到期,但客户端就是报“证书已吊销”。查了半天发现 OCSP 响应超时导致浏览器认为验证失败。后来我们启用了 OCSP Stapling,让服务器自己缓存并推送吊销状态,问题才解决。所以小细节能坑死人。

说实话,HTTPS 不是银弹。它只保护传输中的安全,不防御服务器被入侵、数据库泄漏、CSRF 攻击等。但如果你连传输都不保护,其他安全措施都是空中楼阁。

我建议所有团队在 2025 年之后的项目中,直接默认全站 HTTPS,并且只使用 TLS 1.2 及以上版本。既是对用户负责,也是降低自己的维护成本。