证书有效期怎么判
每张 X.509 证书都带有生效时间与失效时间,客户端校验时会拿本机当前时间去比对这两个边界,落在区间外就拒绝连接。抓包取到的证书可以直接看到这两个时间:当报错内容莫名其妙却又怀疑证书时,先看证书时间窗口是否覆盖当下,再排查链与信任问题,能省掉大量来回猜测。
基本信息
| 抓包字段 | 证书树中的有效期字段,Wireshark 中显示为 notBefore 与 notAfter |
|---|---|
| 过滤表达式 | tls.handshake.certificate 或按握手类型定位证书消息 |
| 判据 | 把当前时间与 notBefore、notAfter 比对,越界即为过期或尚未生效 |
| 必要前提 | 抓包机时钟必须可信,否则比对结论不可靠 |
| 常见关联 | 链上中间证书过期同样会导致校验失败 |
| 旁证手段 | 用 openssl s_client 主动连一次可看到客户端视角的校验结果 |
典型使用场景
- 报错定位:客户端报证书无效,直接用抓包里的时间窗口确认是否过期
- 轮换核对:新旧证书交替期间,确认服务端实际下发的是哪一张
- 多端差异:同一域名在不同客户端表现不同,比较两端拿到的证书是否一致
- 时钟排查:证书尚未生效的报错,多数是客户端时钟落后而不是证书有问题
- 变更验证:换上新年证书后抓包确认已生效下发,避免灰度期遗漏节点
查看证书时间
查看证书时间
# 定位证书消息(握手类型 11)
tshark -r a.pcap -Y 'tls.handshake.type == 11' -T fields -e frame.number -e ip.src | head
tshark -r a.pcap -Y 'tls.handshake.certificate' -V | grep -i 'not before\|not after\|validity'
# 也可从响应体角度确认服务端下发的证书数量(常见为链)
tshark -r a.pcap -Y 'tls.handshake.type == 11' -T fields -e frame.number -e x509sat.printableString | head -20
# 主动旁证: 从客户端视角看校验结果(需网络可达)
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>&1 | grep -i 'verify\|notAfter'现象与推断
| 现象 | 含义 | 下一步 |
|---|---|---|
| notAfter 早于当前时间 | 证书已过期 | 确认服务端是否漏换证书 |
| notBefore 晚于当前时间 | 证书尚未生效 | 优先怀疑客户端时钟落后 |
| 时间窗口正常仍报错 | 问题在信任链或主机名 | 检查链完整性、根证书与域名 |
| 链上中间证书过期 | 部分客户端严格校验链 | 替换整链而非只换叶证书 |
| 各节点下发不同证书 | 灰度或负载不均 | 逐节点核对部署状态 |
客户端时钟错误同样会报证书过期:本机时间被拨快几年,任何证书都显示过期。排查顺序是先对时,再查证书窗口。
证书轮换窗口期内新旧证书可能并存,抓包时按服务端地址区分不同节点,避免拿 A 节点的证书去解释 B 节点的报错。