TLS 证书与握手排查速查
常用命令
openssl s_client -connect example.com:443 -servername example.com
openssl s_client -connect example.com:443 -servername example.com -showcerts
openssl s_client -connect example.com:443 -servername example.com -tls1_2
openssl s_client -connect example.com:443 -servername example.com -alpn h2
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
openssl x509 -in cert.pem -noout -subject -issuer -dates
openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -ext subjectAltName
openssl verify -CAfile ca.pem cert.pem
openssl x509 -in cert.pem -noout -checkend 86400
openssl s_client -connect example.com:443 -servername example.com -verify_return_error
openssl s_client -connect example.com:443 -servername example.com -cert client.pem -key client.key
curl -vI https://example.com
场景速查
| 目的 |
写法/命令 |
注意 |
| 看线上证书 |
s_client ... | openssl x509 -noout -dates |
必须带 -servername 触发 SNI |
| 看完整证书链 |
s_client -showcerts |
检查是否缺中间证书 |
| 看 SAN |
x509 -ext subjectAltName |
现代客户端只认 SAN,不认 CN |
| 检查有效期 |
x509 -checkend 86400 |
退出码 0 表示一天内不过期 |
| 验证证书链 |
openssl verify -CAfile ca.pem cert.pem |
根证书要显式提供 |
| 测协议版本 |
s_client -tls1_2 |
确认服务端是否禁用旧协议 |
| 测 ALPN |
s_client -alpn h2 |
看协商结果是否为 h2 |
| 双向 TLS |
s_client -cert ... -key ... |
客户端证书要带完整链 |
| 定位握手失败 |
curl -vI 或 -verify_return_error |
区分证书、协议与 SNI 问题 |
易错点
- 错误:
s_client 不带 -servername 测虚拟主机;正确:显式加 -servername example.com,否则可能拿到默认站点证书。
- 错误:只看
subject 里的 CN 判断域名;正确:现代客户端校验 SAN,用 -ext subjectAltName 确认。
- 错误:只部署叶子证书;正确:按叶子→中间→根的顺序配置,根证书通常由客户端持有。
- 错误:
openssl verify 不带 -CAfile 验证公网证书;正确:提供受信根或系统 CA 包。
- 错误:把过期当成握手失败的唯一原因;正确:还可能是 SNI、协议版本、加密套件、时间偏差或缺中间证书。
- 错误:mTLS 只在客户端配置证书;正确:服务端要配置 client CA 并验证客户端证书链。
- 错误:用普通抓包查看 TLS 1.3 证书内容;正确:TLS 1.3 握手中的证书已加密,改用
s_client 或应用日志。
- 错误:忽略系统时间偏差;正确:先
date -u 校准,时间错误会造成未生效或已过期误判。
- 错误:私钥权限过宽或与证书不匹配;正确:
chmod 600,并对比证书与私钥的公钥是否一致。
相关命令
读完自测
- 为什么
s_client 要加 -servername?
- 证书链应该按什么顺序配置?
- mTLS 与单向 TLS 的区别是什么?
答案
- 为了在 ClientHello 中携带 SNI,让服务器返回对应域名的证书。
- 按叶子证书→中间证书→根证书的顺序,根证书通常不必下发。
- mTLS 除服务端证书外,客户端也要出示证书并由服务端验证。