HTTPS 加密原理 5 分钟讲明白: SSL 握手 / 证书 / 中间人攻击

📅 2026-09-13 ⏱️ 5 分钟阅读 🏷️ Web 安全 ✍️ BaccAI Team
每次打开网页,看到地址栏那个 绿色小锁,你有没有想过:它到底在干嘛?你输入的银行卡号是怎么"穿越"半个地球传到服务器还不被偷看的?

这篇文章不是给程序员看的,也不讲代码。我用一个咖啡馆点单的故事,把这三个最常被问到的问题讲明白:SSL 握手在交换什么、证书为什么能防中间人攻击、ZeroSSL 这种免费证书到底靠不靠谱。

看完你就能跟技术同事装 X 了。
HTTPS 加密原理 - 绿色小锁的真相
你看到的"绿色小锁"其实是浏览器给你看的"今天这条通信线路是安全的"证书

一、你以为你看到的"绿色锁"到底是什么

Chrome / Safari / Edge 浏览器在地址栏左边显示一个小锁,点开能看到这样几行字:

这 3 行字背后其实在告诉你 3 件事:

  1. 你和这个网站之间发的内容,别人截获了也看不懂(加密传输)
  2. 你连的确实是这个网站,不是冒牌货(身份验证)
  3. 这个网站的证书是浏览器信任的"权威机构"签发的(第三方背书)

绿色锁不是"这个网站是好人"的保证,而是"你和这个网站之间的通信线路是安全的"的保证。

别混淆:绿色锁防的是"传输过程",不是"网站本身"。一个 HTTPS 网站仍然可能卖假货、可能骗你钱、可能装木马。绿色锁只保证:你下单的数据,路上不会被人偷看或篡改。

那"加密"具体怎么工作的?这就得讲到 SSL 握手了。

二、SSL 握手: 浏览器和服务器在偷偷交换什么

想象你在一个嘈杂的咖啡馆,想跟服务员说"我要一杯拿铁,少糖"。但旁边坐着个间谍在偷听。你和服务员需要一种"别人听不懂"的方式完成点单。

真实的 SSL 握手比这个复杂得多,但本质就 4 步:

  1. 打招呼 (Client Hello)
    浏览器说:"你好,我支持 TLS 1.3,这是我能用的加密算法列表。"——告诉服务器"我会这几种语言,你选一种"。
  2. 亮身份证 (Server Hello + 证书)
    服务器说:"好,咱们用 TLS 1.3 + AES-256。"然后掏出一张数字证书——这就是浏览器检查的那个证书。证书里有网站名、公钥、签发机构、有效期。
  3. 验证身份证 (证书验证)
    浏览器拿到证书后,会去查:"这个证书是哪个 CA 签的?这个 CA 我信不信?证书上的域名跟我访问的对不对得上?证书过期没?"——全过了才进入下一步。
  4. 商定一个谁都不知道的暗号 (密钥交换)
    浏览器和服务器用一种数学上很巧妙的方法(椭圆曲线 Diffie-Hellman),在公开信道上算出同一个密钥——这个密钥从来不在网上传输

第 4 步是最妙的地方:

浏览器和服务器各自选了一个"私密数字",通过数学公式交换一些公开信息后,算出来一个相同的密钥。但即使间谍把交换过程全部录下来,也无法反推出这个密钥。这就是"Diffie-Hellman 密钥交换"——RSA 之父之一 Ron Rivest 说这是密码学里最漂亮的协议。

从这一步之后,浏览器和服务器所有的对话都用这个共同密钥加密。即使黑客在中间全程监听,看到的也只是乱码。

SSL 握手四步流程
SSL 握手的 4 个核心步骤,整个过程只需要 200-500 毫秒

三、证书 = 服务器的身份证

在第 2 步,服务器亮出来的"数字证书"到底是个啥?

你可以把它想成一张电子身份证:

证书内容 (简化版):
- 持有人: www.baccpc.com
- 公钥: 04A8F2E91B... (256 位十六进制)
- 有效期: 2026-08-27 至 2026-11-25
- 签发机构: ZeroSSL DV CA
- 签名: 9F7B11CFA5... (CA 用私钥签的)

关键问题是:谁保证这个证书是真的?

这就是 CA (Certificate Authority, 证书颁发机构) 干的事。CA 做的事情很简单:

  1. 验证你真的拥有这个域名(让你在 DNS 加一条记录,或让你改网站文件)
  2. 用 CA 自己的私钥给这个证书签名
  3. 把这个签名附在证书后面

浏览器出厂时内置了100 多家 CA 的公钥(Mozilla 维护)。当浏览器拿到服务器证书时,它会用对应 CA 的公钥去验证签名——能解开就说明这张证书确实是这个 CA 签的。

类比:你的身份证上有公安部的钢印,酒店的身份证扫描器用公安部公开的验签算法验证你的身份证是真的。CA 就是网络世界的"公安部"。

免费证书 vs 付费证书:

类型 价格 验证强度 适合谁
DV (域名验证) 免费 (Let's Encrypt / ZeroSSL) 低,只验证域名所有权 个人站、博客、小企业
OV (组织验证) 几百到几千元/年 中,验证公司真实存在 中型企业、电商
EV (扩展验证) 几千到几万元/年 高,严格审查 + 律师函 银行、支付、大厂

对 99% 的小网站来说,DV 免费证书完全够用。我自己的 baccpc.com 就用的 ZeroSSL 免费 90 天证书,3 个月自动续一次。

四、中间人攻击: 不装 HTTPS 会发生什么

理解了证书,我们再来看为啥没有 HTTPS 就有风险。

想象你去咖啡馆连 WiFi,这个 WiFi 实际上是黑客搭建的(伪装成咖啡馆的免费 WiFi)。你打开 baidu.com,看到正常页面,输入搜索词。

如果你访问的是 HTTP 版的百度,黑客可以做这些事:

咖啡馆类比:你和服务员说话,中间被黑客插了一面玻璃,他能看到你说的所有话,甚至能修改你点的内容(把"少糖"改成"多糖",把收货地址改成自己的)。

这种攻击有个名字叫 MITM (Man-In-The-Middle, 中间人攻击):

这在公共 WiFi 环境下真的会发生,机场、咖啡馆、酒店都有过案例。

装了 HTTPS 后,中间人能看到什么?

GET /login HTTP/1.1
Host: www.baccpc.com
[加密的乱码: a8f2e91b7c4d...]

中间人看到: 乱码
中间人能改吗: 改了浏览器会报错
中间人能重放吗: 不行,有 timestamp + nonce
HTTPS 防中间人的核心机制:即使攻击者能截获所有数据,他也解不开;即使他想伪造响应,浏览器会立刻发现证书不对;即使他想"重放"你昨天的请求,有 timestamp 和随机数机制,服务器会拒收

这就是为什么 Chrome 从 2017 年开始,对所有 HTTP 网站直接显示红色"不安全":

Chrome 对 HTTP 网站显示不安全警告
现在所有主流浏览器都会对 HTTP 站点显示警告

五、为什么 ZeroSSL / Let's Encrypt 出现让 HTTPS 免费

在 2014 年之前,装 HTTPS 一年要几百到几千元,而且流程复杂(要邮寄营业执照、打电话验证)。这让 90% 的小网站装不起 HTTPS,反过来又让"全网加密"成为空话。

Let's Encrypt 2014 年横空出世,做了一件事:把证书签发流程完全自动化。你跑一个小工具,自动验证域名、自动签发、自动部署到服务器,90 天自动续期,完全免费。

背后的赞助商是 Mozilla、Cisco、Akamai、电子前哨基金会这些大厂——他们认为"HTTPS 应该像 HTTP 一样,默认是免费的"。

ZeroSSL 是另一个提供免费 DV 证书的服务,90 天有效期,操作比 Let's Encrypt 还简单(纯网页 UI,不用命令行),我自己在用。

两者的区别:

六、你应该装 HTTPS 的 3 个真实理由(不是"Google 喜欢")

网上很多文章告诉你"装 HTTPS 是因为 Google 喜欢",这其实是最弱的理由。真正让你必须装的理由是这 3 个:

理由 1:访客会跑

Chrome 现在对所有 HTTP 网站直接显示"不安全 · Not Secure"。想象你打开一个电商网站准备下单,地址栏写着"不安全"——你会不会犹豫?

真实数据:HTTPS 网站的平均转化率比 HTTP 高 5-15%(来源:HubSpot, 2024)。这不是 SEO 排名问题,是用户心理问题。

理由 2:浏览器功能会受限

很多现代浏览器功能只对 HTTPS 站点开放:

不用 HTTPS,这些功能全部用不了。

理由 3:SEO 真的挂钩

Google 自 2014 年起就把 HTTPS 列为搜索排名因素。Moz 2023 年的统计显示,HTTP 站点在前 3 名的占比从 2018 年的 25% 跌到 2023 年的 3%

不是因为 HTTPS 神奇,而是因为:能装 HTTPS 的网站通常基础维护更好(SSL 证书本身就要定期续期,反映了运营态度)。Google 把它当质量信号

七、装 HTTPS 之前要知道的 5 件事

  1. 证书不是装了就完事,要续期——Let's Encrypt / ZeroSSL 都是 90 天,要么自己写脚本自动续,要么用 官方工具。我之前因为忘了续期,证书过期 12 小时,网站直接打不开。
  2. 证书里的域名必须跟你访问的域名一致——证书是给 www.baccpc.com 的,你访问 baccpc.com(不带 www)就会报错。免费的只能签单域名,要么签两张,要么用通配符(贵)。
  3. 装 HTTPS 不会让 SEO 排名立刻起飞——它是必要条件,不是充分条件。我自己 6 月装完到现在,排名变化主要靠内容质量,不是证书。
  4. 移动浏览器对自签名证书零容忍——iOS Safari 直接红屏警告,用户不可能点"继续访问"。你必须用正规 CA 签的证书。
  5. HTTPS 装完记得做 301 跳转——HTTP 版本要 301 到 HTTPS,不然搜索引擎会同时收录两个版本,分散权重。

想自己动手装 HTTPS?

我把我自己装 ZeroSSL 证书 + IIS 反代 + 移动浏览器兼容的全过程写成了 3 篇实操日记:

📱 移动浏览器自签证书坑 🔄 90 天续期 SOP 🛠️ 在线试 HTTPS 检测

常见问题 FAQ

HTTPS 和 HTTP 到底有什么区别?
HTTP 是明文传输,你在网页上填的密码、银行卡号、聊天内容都是原文发出去的,黑客在中间一抓就能看到。HTTPS 是在 HTTP 之上加了一层 TLS 加密,数据出门前会被加密,只有真正的服务器能解开。简单说:HTTP 是明信片,谁都能看;HTTPS 是上了锁的快递,只有收件人能开。
那个绿色小锁就代表安全吗?
绿色锁只代表 3 件事:1) 你和服务器之间的通信是加密的,2) 你连的确实是证书里写的那个域名,3) 这个证书是浏览器信任的 CA 机构签发的。它不能保证:服务器本身是好人、网站内容不骗人、你下的软件没毒。HTTPS 防的是传输过程,不是网站本身。
为什么有些 HTTPS 还是显示不安全?
一般是这 3 种情况:1) 证书过期了(SSL 证书通常 90 天 / 1 年),2) 证书的域名跟你访问的域名对不上(比如证书是 www.b.com 你访问的是 b.com),3) 证书是自签名的,不是受信任 CA 签的(浏览器不认)。前两个我都在 baccpc.com 迁移时踩过,详见我的实操文章。
证书为什么有免费的?CA 机构靠什么活?
Let's Encrypt 是非营利组织,由 Mozilla、Cisco、Akamai 等大厂赞助,使命就是让全网 HTTPS 化。ZeroSSL 是商业化版本,免费 90 天证书,主要靠付费 Wildcard / 多域名证书和签发服务赚钱。CA 机构的核心收入其实是给企业签发 EV(扩展验证)证书,那种证书会显示公司名,银行和大公司在用。
我自己的小网站需要装 HTTPS 吗?
需要,理由是 3 个:1) Chrome / Safari 现在对 HTTP 网站直接显示"不安全",访客看一眼就跑了;2) Google 搜索结果里 HTTPS 站点排名略高,SEO 直接挂钩;3) ZeroSSL 和 Let's Encrypt 都免费,90 天自动续期,装一次就完事。我的 baccpc.com 从申请到部署只用了 6 小时,你可以看我的实操日记。