HTTPS 加密原理 5 分钟讲明白: SSL 握手 / 证书 / 中间人攻击
这篇文章不是给程序员看的,也不讲代码。我用一个咖啡馆点单的故事,把这三个最常被问到的问题讲明白:SSL 握手在交换什么、证书为什么能防中间人攻击、ZeroSSL 这种免费证书到底靠不靠谱。
看完你就能跟技术同事装 X 了。
一、你以为你看到的"绿色锁"到底是什么
Chrome / Safari / Edge 浏览器在地址栏左边显示一个小锁,点开能看到这样几行字:
- "连接是安全的"
- "证书有效"
- "此网站使用了 HTTPS"
这 3 行字背后其实在告诉你 3 件事:
- 你和这个网站之间发的内容,别人截获了也看不懂(加密传输)
- 你连的确实是这个网站,不是冒牌货(身份验证)
- 这个网站的证书是浏览器信任的"权威机构"签发的(第三方背书)
绿色锁不是"这个网站是好人"的保证,而是"你和这个网站之间的通信线路是安全的"的保证。
那"加密"具体怎么工作的?这就得讲到 SSL 握手了。
二、SSL 握手: 浏览器和服务器在偷偷交换什么
真实的 SSL 握手比这个复杂得多,但本质就 4 步:
-
打招呼 (Client Hello)
浏览器说:"你好,我支持 TLS 1.3,这是我能用的加密算法列表。"——告诉服务器"我会这几种语言,你选一种"。 -
亮身份证 (Server Hello + 证书)
服务器说:"好,咱们用 TLS 1.3 + AES-256。"然后掏出一张数字证书——这就是浏览器检查的那个证书。证书里有网站名、公钥、签发机构、有效期。 -
验证身份证 (证书验证)
浏览器拿到证书后,会去查:"这个证书是哪个 CA 签的?这个 CA 我信不信?证书上的域名跟我访问的对不对得上?证书过期没?"——全过了才进入下一步。 -
商定一个谁都不知道的暗号 (密钥交换)
浏览器和服务器用一种数学上很巧妙的方法(椭圆曲线 Diffie-Hellman),在公开信道上算出同一个密钥——这个密钥从来不在网上传输。
第 4 步是最妙的地方:
从这一步之后,浏览器和服务器所有的对话都用这个共同密钥加密。即使黑客在中间全程监听,看到的也只是乱码。
三、证书 = 服务器的身份证
在第 2 步,服务器亮出来的"数字证书"到底是个啥?
你可以把它想成一张电子身份证:
证书内容 (简化版):
- 持有人: www.baccpc.com
- 公钥: 04A8F2E91B... (256 位十六进制)
- 有效期: 2026-08-27 至 2026-11-25
- 签发机构: ZeroSSL DV CA
- 签名: 9F7B11CFA5... (CA 用私钥签的)
关键问题是:谁保证这个证书是真的?
这就是 CA (Certificate Authority, 证书颁发机构) 干的事。CA 做的事情很简单:
- 验证你真的拥有这个域名(让你在 DNS 加一条记录,或让你改网站文件)
- 用 CA 自己的私钥给这个证书签名
- 把这个签名附在证书后面
浏览器出厂时内置了100 多家 CA 的公钥(Mozilla 维护)。当浏览器拿到服务器证书时,它会用对应 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 热点,拦截你所有的 HTTP 请求
- 你的请求原文经过他,你的响应原文也经过他
- 他可以看到你浏览的所有内容、修改网页(比如把银行页面的转账目标改成他的账号)、注入广告或恶意代码
这在公共 WiFi 环境下真的会发生,机场、咖啡馆、酒店都有过案例。
装了 HTTPS 后,中间人能看到什么?
GET /login HTTP/1.1
Host: www.baccpc.com
[加密的乱码: a8f2e91b7c4d...]
中间人看到: 乱码
中间人能改吗: 改了浏览器会报错
中间人能重放吗: 不行,有 timestamp + nonce
这就是为什么 Chrome 从 2017 年开始,对所有 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,不用命令行),我自己在用。
两者的区别:
- Let's Encrypt: 90 天,需要
certbot命令行工具,Linux 友好,Windows 麻烦 - ZeroSSL: 90 天,纯网页 UI,DNS 验证,Windows / Mac / Linux 一样方便
- Cloudflare: 背后免费帮你签,自动续期,但流量要过 Cloudflare(适合用 CF 加速的站)
六、你应该装 HTTPS 的 3 个真实理由(不是"Google 喜欢")
网上很多文章告诉你"装 HTTPS 是因为 Google 喜欢",这其实是最弱的理由。真正让你必须装的理由是这 3 个:
理由 1:访客会跑
Chrome 现在对所有 HTTP 网站直接显示"不安全 · Not Secure"。想象你打开一个电商网站准备下单,地址栏写着"不安全"——你会不会犹豫?
真实数据:HTTPS 网站的平均转化率比 HTTP 高 5-15%(来源:HubSpot, 2024)。这不是 SEO 排名问题,是用户心理问题。
理由 2:浏览器功能会受限
很多现代浏览器功能只对 HTTPS 站点开放:
- 地理位置 API (Geolocation)
- 摄像头/麦克风访问 (getUserMedia)
- Service Worker (PWA 离线)
- Web Push 通知
- HTTP/2 (性能提升 30-50%)
不用 HTTPS,这些功能全部用不了。
理由 3:SEO 真的挂钩
Google 自 2014 年起就把 HTTPS 列为搜索排名因素。Moz 2023 年的统计显示,HTTP 站点在前 3 名的占比从 2018 年的 25% 跌到 2023 年的 3%。
不是因为 HTTPS 神奇,而是因为:能装 HTTPS 的网站通常基础维护更好(SSL 证书本身就要定期续期,反映了运营态度)。Google 把它当质量信号。
七、装 HTTPS 之前要知道的 5 件事
- 证书不是装了就完事,要续期——Let's Encrypt / ZeroSSL 都是 90 天,要么自己写脚本自动续,要么用 官方工具。我之前因为忘了续期,证书过期 12 小时,网站直接打不开。
- 证书里的域名必须跟你访问的域名一致——证书是给
www.baccpc.com的,你访问baccpc.com(不带 www)就会报错。免费的只能签单域名,要么签两张,要么用通配符(贵)。 - 装 HTTPS 不会让 SEO 排名立刻起飞——它是必要条件,不是充分条件。我自己 6 月装完到现在,排名变化主要靠内容质量,不是证书。
- 移动浏览器对自签名证书零容忍——iOS Safari 直接红屏警告,用户不可能点"继续访问"。你必须用正规 CA 签的证书。
- HTTPS 装完记得做 301 跳转——HTTP 版本要 301 到 HTTPS,不然搜索引擎会同时收录两个版本,分散权重。
想自己动手装 HTTPS?
我把我自己装 ZeroSSL 证书 + IIS 反代 + 移动浏览器兼容的全过程写成了 3 篇实操日记:
📱 移动浏览器自签证书坑 🔄 90 天续期 SOP 🛠️ 在线试 HTTPS 检测