首页/我的作品/密码学/9.1 HTTPS:浏览器小锁背后的故事
密码学:守护数字世界的秘密

9.1 HTTPS:浏览器小锁背后的故事

第 50 / 78 篇 · Crazy Boy

你在浏览器地址栏输入一个网址,比如 https://www.example.com,然后按下回车。几秒钟后,网页加载完成,地址栏左边出现了一把绿色的小锁。整个过程行云流水,你几乎没有意识到——就在这短短几秒里,你的浏览器和网站服务器已经完成了一场复杂的加密对话,为你接下来的每一次点击铺好了安全通道。

那把锁,就是 HTTPS 的标志。它的全称是“超文本传输协议安全版”(HyperText Transfer Protocol Secure)。简单来说,它是在 HTTP 外面加了一层加密外壳,让你的数据在互联网上传输时不会被别人偷看或篡改。

为什么需要这层外壳?

想象一下,你在咖啡馆里打开笔记本电脑,连上公共 Wi-Fi,然后登录网银。如果你用的是普通的 HTTP(没有加密),那么你输入的所有信息——账号、密码、转账金额——都会以明文的形式在网络中传输。这意味着,任何在同一个 Wi-Fi 下的人,甚至咖啡馆的 Wi-Fi 热点本身,都可以用免费的网络嗅探工具(比如 Wireshark)截获你的数据包,直接看到你的密码。

这就像你在人山人海的广场上,对着银行工作人员大声喊出自己的银行卡号和密码。虽然你觉得自己是在跟银行说话,但周围所有人都听得一清二楚。

HTTP 的另一个问题是数据完整性。攻击者不仅能看到你的数据,还可以在传输过程中修改它。比如,你本来想转账 100 元,但有人中间把你的数据包改成了 10000 元,等你确认时,钱已经飞走了。这就是所谓的“中间人攻击”(Man-in-the-Middle Attack)。

为了解决这些问题,网景公司在 1994 年发明了 SSL(安全套接层),后来演变成 TLS(传输层安全协议)。HTTPS 其实就是 HTTP over TLS——先用 TLS 建立一个加密隧道,然后再通过这个隧道传输 HTTP 数据。当你看到那把锁时,就意味着这个加密隧道已经成功建立。

加密隧道是怎么建成的?

你可能会想:建立一个加密隧道,是不是就像两个人提前约定好一个密码,然后每次说话都用这个密码加密?但问题是,你和网站之前从未见过面,也没有机会提前交换密码。怎么才能在第一次通信时,就建立一条安全的加密通道呢?

这就是 TLS 握手的任务。我们用一个简化的故事来描述:

第一步:打招呼(ClientHello)
你的浏览器(客户端)向网站服务器发送一条消息,告诉服务器:“我支持哪些加密算法,我生成了一个随机数,我们开始吧。”这条消息是明文的,因为此时还没有加密。

第二步:亮身份(ServerHello + 证书)
服务器收到后,也发回一条消息:“我选择用这个加密算法,我也生成了一个随机数。”同时,服务器还会把自己的数字证书一起发过来。证书里包含了服务器的公钥,以及证明这个公钥确实属于该网站的信息(比如域名)。这个证书是由权威机构(CA)签名的,我们之前在第 8 章讲过。

第三步:验证证书
浏览器收到证书后,会做几件事:检查证书是否在有效期内,检查证书的域名是否与访问的网站一致,用操作系统中预装的根证书验证这个证书的签名是否有效。如果一切正常,浏览器就相信:我现在正在和真正的 example.com 对话,而不是某个骗子。

第四步:交换密钥(Pre-master Secret)
浏览器生成一个临时的“预主密钥”(Pre-master Secret),然后用服务器的公钥加密它,发送给服务器。由于只有服务器有对应的私钥,所以只有它能解密这个预主密钥。

第五步:计算会话密钥
双方现在都有了自己的随机数和服务器的随机数,再加上预主密钥,通过一个密钥导出函数,各自独立计算出相同的“会话密钥”。这个会话密钥是对称加密的密钥,用于接下来加密所有数据。

第六步:切换加密,确认完毕
双方互相发送一条消息,告诉对方:“从现在开始,我用会话密钥加密。”然后发送一条“Finished”消息,这条消息是加密的,用来验证整个握手过程没有被篡改。如果双方都能正确解密对方的消息,握手就成功了。

至此,加密隧道建成。之后的所有 HTTP 数据(网页内容、表单提交等)都会用这个会话密钥进行对称加密(比如 AES),安全地传输。因为对称加密速度快,所以不会影响浏览体验。

为什么锁有不同颜色?

你可能注意到,有些网站的锁是绿色的,有些是灰色的,有时还会出现一个黄色的三角警告。这些颜色代表了证书的安全等级:

  • 绿色锁(或带公司名称的锁):通常是 EV(扩展验证)证书。颁发这类证书时,CA 会严格核实网站背后公司的法律身份。在地址栏会显示公司名称,表示网站可信度最高。
  • 灰色锁:最普通的 DV(域名验证)证书。CA 只验证你对域名的控制权(比如通过邮件或 DNS),不验证公司身份。这足以保证加密,但无法证明网站背后是谁。
  • 红色或带斜杠的锁:表示证书有问题——可能已过期、域名不匹配、或者证书不是由受信任的 CA 签发。此时浏览器会发出警告,强烈建议你不要继续访问。

小锁背后的保障

那把锁不仅是加密的象征,它还承诺了三件事:

  1. 保密性:你与网站之间的通信是加密的,别人无法偷看。
  2. 完整性:数据在传输过程中不会被篡改。如果有人试图修改,TLS 的完整性校验会发现并拒绝连接。
  3. 身份认证:你至少能确认自己连上了真正的网站(而非伪造的钓鱼网站)。DV 证书能保证域名是你输入的,EV 证书还能让你知道是谁在运营这个网站。

正是这三条,让现代互联网的商业交易、社交沟通、个人信息传输成为可能。没有 HTTPS,我们不敢在网上购物,不敢输入银行卡号,甚至不敢登录邮箱。

从 HTTP 到 HTTPS:一场漫长的迁移

今天,几乎所有的网站都默认使用 HTTPS。但十年前,情况完全不同。当时只有银行、电商等敏感网站才用 HTTPS,普通网站还是明文的 HTTP。2014 年,Google 宣布将把 HTTPS 作为搜索排名的加分项;2017 年,Chrome 浏览器开始把 HTTP 网站标记为“不安全”。再加上 Let‘s Encrypt 等免费证书服务的普及,整个互联网终于完成了向 HTTPS 的过渡。

如今,当你看到那把小锁时,你可以安心地输入密码、提交表单、在线支付。它是现代互联网最基础的安全设施,也是你每天与密码学打交道的第一个见证者。

下一节,我们将深入 TLS 握手的内部,用流程图一步步拆解那个“几秒钟内完成的对话”,看看加密隧道究竟是如何在毫秒之间建成的。