地址栏的小锁挂了这么多年,多数人说不清它锁的是什么。这篇用一个比喻把 TLS 握手拆开:浏览器和服务器是两个初次见面的陌生人,要在满是窃听者的房间里商量出一把只有他俩知道的钥匙。
第一步:亮证件
浏览器敲门(Client Hello):我支持这些加密套件、这是我的随机数。服务器回应(Server Hello):选定套件、给出自己的随机数,然后掏出证书——相当于一张由公证处(CA)签发的身份证,写着"我确实是 woshale.com,公证处的钢印在此"。
第二步:验钢印
浏览器不信任证件本身,信任的是钢印。它顺着证书链一路向上查:站点证书 → 中间 CA → 根证书。根证书出厂就躺在操作系统里,所以这条信任链的尽头是"出厂设置"。我们用 Let's Encrypt 签发证书,本质就是请这个公益 CA 在自己的身份证上盖一个它有资格盖的章。
第三步:协商钥匙
关键来了:两边各出一半随机数,再用非对称算法(如 ECDHE)凑出同一把会话密钥——这个过程里窃听者看得见所有交换材料,却算不出密钥本身。这就是"非对称加密传钥匙、对称加密传数据"的分工。
# 亲手看一次握手(你的机器上就能跑)
openssl s_client -connect woshale.com:443 -servername woshale.com
# 关注输出里这几行:
# Verify return code: 0 (ok) ← 钢印验讫
# Server public key is 2048 bit ← 证件里的公钥
# New, TLSv1.3, Cipher is ... ← 商量好的算法
HTTPS 不是"加密了这么简单",它是用一整套信任链回答了一个更难的问题:你怎么知道对面真的是它自称的那位?
为什么后来又有 TLS 1.3
1.2 的握手要两个来回,1.3 砍到一个——陌生人的寒暄能省则省,顺便把一批已被攻破的老算法扫地出门。你访问本站时看到 TLSv1.3,就是这场精简后的对话。