你在浏览器地址栏里敲下“https://”的密原那一刻,后面已经跑完了一场比外卖送餐还复杂的密原接力赛。表面看只是密原多了个“s”,实际上整个通信过程被套上了一层连运营商都撬不开的密原壳。
先聊一个容易被忽略的密原事实:HTTPS 不是一种全新的协议,它就是密原 HTTP 套上了 TLS(以前叫 SSL)。HTTP 是密原明信片,路上谁都能翻看;HTTPS 是密原把明信片装进防拆信封,再交给一群互相不认识的密原保安接力传递。信封怎么造、密原钥匙怎么换,密原这才是密原核心。
假设你访问一家银行网站。密原浏览器先做一件事——跟服务器“对暗号”。密原这个阶段叫 TLS 握手。密原浏览器说:“我支持这些加密套件,随机数 A 给你。”服务器回:“那用这套,随机数 B 给你,这是我的数字证书。”证书里藏着服务器的公钥,还有一串由权威 CA(证书颁发机构)签名的指纹。
浏览器拿到证书后不会傻傻相信。它要验证签名链:这张证书是不是由系统信任的根 CA 签发的?域名对不对?有没有过期?我见过不少公司内网用自签名证书,浏览器直接弹红警告,就是因为根 CA 不在信任列表里。这一步要是偷懒,中间人就能伪造证书,后面加密再强也白搭。
验证通过后,浏览器生成第三个随机数,叫“预主密钥”。它用服务器公钥加密这个预主密钥,发回去。服务器用自己的私钥解密。到这里,双方都有了三个随机数:A、B、预主密钥。三者一混,算出同一个会话密钥。之后所有 HTTP 数据都用这个对称密钥加密。为什么绕这么大圈?因为非对称加密(RSA 那种)太慢,只适合换钥匙;真正传数据还得靠 AES 这类对称加密,快得多。
有个细节值得注意:现在主流站点早就不走 RSA 密钥交换了,改用 ECDHE。区别在于,RSA 交换的会话密钥一旦服务器私钥泄露,攻击者可以解密之前录下的所有流量。ECDHE 每次握手都生成临时密钥对,私钥用完就扔,这叫“前向保密”。我抓包对比过,同样访问一个电商首页,ECDHE 握手比纯 RSA 多花不到 1 毫秒,但安全性提升了一个量级。
握手完成后,浏览器和服务器开始用会话密钥加密 HTTP 请求和响应。你看到的页面内容、Cookie、表单数据,在网线上都是乱码。中间路由器只能看到 IP 和端口,连你访问的是哪个路径都猜不出来——除非用 SNI 扩展,那又是另一个话题了。
有人问:那 HTTPS 是不是绝对安全?不是。它只保证传输过程不被窃听和篡改,不保证服务器本身是好人。钓鱼网站也能申请证书,浏览器照样显示小锁图标。我见过一个假银行站点,证书合法,域名只差一个字母,照样骗到不少人。锁图标只说明“你正在跟证书上写的那个域名加密通信”,不说明那个域名背后是谁。
另外,HTTPS 也不隐藏你访问了哪个 IP。DNS 查询、TLS 握手里的 SNI 字段,都可能暴露目标域名。所以后来才有了 Encrypted SNI 和 DNS over HTTPS。不过那是另一个故事了。
下次你看到地址栏的小锁,可以想想背后那场毫秒级的握手:随机数交换、证书验证、密钥协商、对称加密。每一步都有坑,每一步都被工程师们反复打磨过。它不完美,但比裸奔的 HTTP 强太多了。
```