外观
HTTPS 与 TLS:一次握手的全过程
约 1304 字
HTTPS = HTTP + TLS。大家都知道「HTTPS 安全」,但安全在哪、 怎么建立的,很多人说不清。这篇从「不加密会怎样」出发, 把 TLS 握手讲透。
一、没有 TLS 的世界
明文 HTTP 的问题:
- 窃听:咖啡店公共 WiFi,你的登录密码裸奔;
- 篡改:运营商/中间人给你页面插广告、改内容;
- 冒充:假的
bank.com给你,你也分不清。
TLS 一次解决三个:加密(防窃听)、完整性校验(防篡改)、 身份认证(防冒充)。
二、两种加密:各干各的活
对称加密:快,但钥匙怎么送
加密解密同一把钥匙(AES 就是)。快,适合传数据。 死结:钥匙怎么安全送到对方手里?明文送,被人截了就完了。
非对称加密:慢,但能安全换钥匙
一对钥匙:公钥(公开)和私钥(藏好)。公钥加密的只有私钥能解, 私钥加密的只有公钥能解(后者就是「签名」)。
解法雏形:用非对称加密安全地协商出对称密钥, 后面用对称加密传数据。
客户端:我用你的公钥加密一个随机数发过去
服务端:用私钥解开,拿到随机数
双方: 这就是我们的对称密钥,开始用 AES 聊但这里还有个大坑:公钥本身可信吗?中间人把假公钥给你, 你找他「握手」,他跟真服务端握手,你俩聊的内容他全看得到 —— 这就是中间人攻击。所以需要第三方公证:证书。
三、证书:CA 当担保人
服务端的公钥,装在一个 CA(证书颁发机构)签发的证书里:
证书内容:
域名: api.myapp.com
公钥: MIIBIjANBg…
签发者: Let's Encrypt R3
有效期: 2026-09-01 ~ 2026-11-30
CA 的签名: (用 CA 私钥对上面内容的哈希加密)客户端怎么验:
- 用内置的 CA 公钥列表(操作系统/浏览器带的)解开签名;
- 签名对得上 → 证书没被改,且是受信任的 CA 签的;
- 证书里的域名和正在访问的域名对得上;
- 有效期没过。
四条全过,才敢用证书里的公钥。这套链就是信任链: 你信任浏览器厂商 → 厂商信任根 CA → 根 CA 签中间 CA → 中间 CA 签网站证书。
你的服务器证书 certbot 免费就能办(Let's Encrypt), 配法在 Nginx 部署(在新窗口打开) 那篇有。
四、TLS 1.3 握手:两轮搞定
TLS 1.2 要 2-RTT(两个来回),1.3 压到 1-RTT,重连 0-RTT。 简化流程:
① 客户端 → ClientHello:我支持的加密套件清单 + 我的随机数 + 我的密钥共享参数
② 服务端 → ServerHello:选定套件 + 服务端随机数 + 服务端密钥共享参数 + 证书
服务端此时已能算出会话密钥(不用等客户端确认!)
③ 客户端 → Finished:验证书 → 算出同样密钥 → 「我开始加密了」
第一个应用数据(HTTP 请求)可以搭这趟车一起发!
④ 服务端 → Finished1.3 的精妙:客户端在第一步就把密钥素材送了(Key Share), 服务端收到就能算密钥,省掉 1.2 里「确认套件→再换证书→再换密钥」的来回。
弱算法在 1.3 里被清场:RSA 密钥交换、RC4、DES、MD5 全删了。 留下的是 AEAD 加密套件(AES-GCM、ChaCha20-Poly1305)。
五、前向保密:丢了私钥也别翻旧账
TLS 1.3 只用「临时 Diffie-Hellman」换密钥: 每次连接生成一对临时密钥,聊完就扔。
好处:就算服务端私钥哪天被盗,攻击者也只能冒充服务端, 解不开之前截获的历史流量(那些流量用的是已销毁的临时密钥)。 老式的 RSA 密钥交换没这特性 —— 私钥一丢,历史全裸。
六、实战:看自己网站的 TLS
# 看证书链和协议版本
openssl s_client -connect api.myapp.com:443 -servername api.myapp.com </dev/null | openssl x509 -noout -subject -issuer -dates
# 看用的协议和加密套件
curl -sv https://api.myapp.com 2>&1 | grep "SSL connection"在线评分:SSL Labs 的 SSL Test, 输入域名出报告。A+ 不算难,Nginx 配上 HSTS 头和现代套件就行。
七、常见误区
「小网站不用 HTTPS」:错。Let's Encrypt 免费,HTTP/2 要 TLS 才普及, 搜索引擎排名也偏向 HTTPS。没有理由不用。
「用了 HTTPS 就绝对安全」:错。TLS 只保护传输。 XSS、CSRF、SQL 注入一个不防 —— 那些是应用层的事 (见 Web 安全入门)。
「证书装了就永远有效」:错。Let's Encrypt 证书 90 天过期, certbot renew 自动续(配了定时任务的话)。见过证书过期导致 App 全线瘫痪的事故 —— 监控要覆盖证书到期时间。
小结
HTTPS 三件套:非对称加密安全换钥匙、证书解决信任、TLS 1.3 一轮握手 搞定协商。前向保密保证历史流量不翻旧账。 用户看到地址栏小锁头,背后就是这套机制在打工。