1. TLS基础回顾:握手协议、密码套件、证书链验证机制
讲TLS稳定策略之前,咱们得先把地基打牢。我见过太多团队在排查连接问题时,连握手失败是发生在哪一步都说不清楚。说白了,TLS不是什么黑魔法,它就是一套约定——客户端和服务端怎么打招呼、怎么商量加密方式、怎么确认对方身份。
这一章,我们只聊三个核心:握手协议、密码套件、证书链验证。嗯,都是老生常谈的东西,但我会结合我踩过的坑来讲。
1.1 握手协议——一次完整的“对暗号”过程
TLS握手,说白了就是双方互相确认身份、协商加密参数的过程。我习惯把它拆成四个阶段:
- Hello阶段:客户端发个“你好”,带上自己支持的TLS版本、密码套件列表、随机数。服务端回个“收到”,选定版本和套件,也带上自己的随机数。
- 认证阶段:服务端发证书(通常是X.509格式),客户端验证证书链。如果需要双向认证,客户端也要发证书。
- 密钥交换阶段:双方用公钥加密或DH算法,协商出一个对称密钥。这个密钥只有他俩知道。
- 完成阶段:双方发个“握手完成”消息,之后所有数据都用对称密钥加密传输。
核心要点:握手阶段最耗时,也最容易出问题。我在项目中遇到过因为网络延迟导致握手超时的情况,后来加了会话复用才解决。
你想想看,如果每次连接都走完整握手,那延迟得多高?所以TLS设计了会话复用机制——用Session ID或Session Ticket跳过部分握手步骤。这个后面章节会细讲。
1.2 密码套件——加密算法的“套餐组合”
密码套件就是一组算法的组合。我经常把它比作“套餐”——你选一个套餐,里面包含了密钥交换、身份验证、对称加密、消息完整性校验这四样东西。
举个例子,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 这个套件:
- ECDHE:密钥交换用椭圆曲线Diffie-Hellman(支持前向安全性)
- RSA:身份验证用RSA签名
- AES_256_GCM:对称加密用256位AES的GCM模式
- SHA384:消息完整性校验用SHA-384哈希
我个人习惯把常用套件按安全性分个类:
| 安全等级 | 推荐套件示例 | 说明 |
|---|---|---|
| 强烈推荐 | TLS_AES_128_GCM_SHA256 |
TLS 1.3默认套件,性能好 |
| 强烈推荐 | TLS_AES_256_GCM_SHA384 |
更高安全强度,适合敏感数据 |
| 推荐(兼容旧设备) | ECDHE-RSA-AES128-GCM-SHA256 |
TLS 1.2套件,前向安全 |
| 不推荐 | TLS_RSA_WITH_AES_128_CBC_SHA |
无前向安全,CBC模式有漏洞 |
| 禁止使用 | TLS_RSA_WITH_RC4_128_SHA |
RC4已被破解 |
避坑指南:我曾经在配置Nginx时,只开了几个“最强”套件,结果发现一些老手机连不上。后来我调整策略——优先用TLS 1.3的套件,同时保留几个安全的TLS 1.2套件做降级兼容。
1.3 证书链验证机制——信任的传递
证书链验证,说白了就是回答一个问题:“我怎么相信这个证书是真的?”
答案很简单——信任是传递的。你的证书由某个CA签发,那个CA的证书由更上层的CA签发,直到根CA。根CA的证书是自签名的,预装在操作系统或浏览器里。
验证过程是这样的:
- 客户端拿到服务端证书,检查域名是否匹配、有效期是否过期。
- 用签发者CA的公钥验证证书签名。
- 递归验证CA证书,直到根证书。
- 检查根证书是否在受信任的根证书列表里。
- 检查证书是否被吊销(通过CRL或OCSP)。
小技巧:我建议你在服务端配置证书时,把中间CA证书也一并带上。很多连接失败的原因就是服务端只发了终端证书,客户端没有中间CA证书,导致链不完整。
这里有个容易忽略的点——证书吊销检查。OCSP(在线证书状态协议)是实时查询,但会增加握手延迟。我见过有些客户端因为OCSP响应超时,直接拒绝连接。后来我们用了OCSP Stapling——服务端自己定期查询OCSP结果,握手时直接发给客户端,省去了客户端的查询时间。
1.4 知识体系总览
下面这张图,我把TLS基础的核心逻辑串起来了。你一看就明白:
1.5 常见问题与排查思路
讲完理论,咱们聊聊实际中容易踩的坑。我列几个最常见的:
- 证书过期:这个最蠢也最常见。我建议你写个脚本定期检查证书有效期,提前30天报警。
- 密码套件不匹配:客户端和服务端没有共同支持的套件。排查时抓包看ClientHello和ServerHello里的套件列表。
- 证书链不完整:服务端没发中间CA证书。用openssl s_client -connect 就能看出来。
- OCSP响应慢:客户端查吊销状态超时。解决方案是启用OCSP Stapling。
- SNI缺失:老客户端不支持SNI,导致多域名服务器返回了错误的证书。
排查工具推荐:我个人习惯用 openssl s_client -connect host:port -debug 看握手细节。想快速检查证书链,用 openssl verify -CAfile ca.pem cert.pem。
嗯,TLS基础就聊到这儿。这些内容看着简单,但很多复杂网络环境下的问题,追根溯源都能回到握手协议、密码套件、证书链这三个点上。后面章节我们会在这个基础上,深入聊各种稳定策略。