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 问题

易错点

相关命令

读完自测

  1. 为什么 s_client 要加 -servername?
  2. 证书链应该按什么顺序配置?
  3. mTLS 与单向 TLS 的区别是什么?
答案
  1. 为了在 ClientHello 中携带 SNI,让服务器返回对应域名的证书。
  2. 按叶子证书→中间证书→根证书的顺序,根证书通常不必下发。
  3. mTLS 除服务端证书外,客户端也要出示证书并由服务端验证。