Lazy loaded image
OpenSSL 使用 s_client 进行 TLS 测试
Words 1089Read Time 3 min
2025-9-30
2025-11-10
date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Nov 10, 2025 10:02 PM
是否已更新
orginal_page
是否推荐
参考文档
 

概述

  • s_client 工具是一个用于测试和调试 SSL/TLS 连接的命令行工具
s_client 报告结果仅代表建立连接,不代表证书完全正确,也不意味着证书配置正确
  • Verify return code: 0 (ok) 表示证书验证正常
  • Verify return code: 20 (unable to get local issuer certificate) 表示无法获取本地颁发者证书
    • 可以通过指定 CA 位置可以修正
    • openssl s_client -connect www.feistyduck.com:443 -CApath /etc/ssl/certs/
    • openssl s_client -connect www.feistyduck.com:443 \ -CAfile /etc/ssl/certs/ca-certificates.crt
  • Verify return code: 62 (Hostname mismatch) 表示主机名不适配
 

测试 TLS 连接

s_client 建立到 TLS 服务器的连接
  • openssl s_client -crlf \ -connect www.feistyduck.com:443 \ -servername www.feistyduck.com
    • -connect 选项用于建立 TCP 连接,可以是 IP 地址
    • -servername 选项用于指定主机名
      • OpenSSL 早期版本不会根据 -connect 自动填充 -servername
      • 如果是 IP 地址则必须提供 -servername
      • -noservername 选项可以在 TLS 握手中避免发送主机名信息
  • 其他选项
    • -verify_hostname 选项用于指定需要验证的主机名
    • -starttls 选项在建立 TLS 之前使用合适的协议而非 HTTPS,如 -starttls smtp
      • 支持协议
        • smtppop3imapftpxmppxmpp-serverircpostgresmysqllmtpnntpsieve, ldap
      • 部分协议需要搭配 -name 选项,如 smtp 需要提供名称 -name mail.example.com
s_client 测试 TLS 协议版本
  • 可选项
    • -min_protocol, -max_protocol
    • 特定版本:-ssl2-ssl3-tls1-tls1_1-tls1_2-tls1_3
      • 忽略某个版本:-no_**
  • openssl s_client -connect www.example.com:443 -tls1_2
s_client 测试会话恢复和保存/读取会话状态
  • 测试会话恢复
    • echo | openssl s_client -connect www.feistyduck.com:443 -reconnect 2> /dev/null | grep 'New\|Reuse'
      • 只关心特定输出,抛弃了标准错误输出
        • New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
        • Reused, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
  • 保存会话状态至 sess.pem
    • openssl s_client -connect www.feistyduck.com:443 -sess_out sess.pem
  • 复用 sess.pem 会话状态文件
    • openssl s_client -connect www.feistyduck.com:443 -sess_in sess.pem
s_client 提取远程服务器证书
  • s_client 默认只显示叶子证书,显示完整证书链需要提供 -showcerts 选项
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > feistyduck.crt
    • echo | openssl s_client -showcerts -connect www.feistyduck.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > feistyduck.crt
  • 配合 x509 工具显示详细的服务器信息及其SHA256指纹
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | openssl x509 -noout -text -fingerprint -sha256
  • 配合 x509 工具进一步提取证书指纹
    • OpenSSL 默认以显示单个字节的格式输出证书,并使用冒号分隔它们
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | openssl x509 -noout -fingerprint -sha256 | sed 's/://g' | tr '[:upper:]' '[:lower:]' | sed 's/sha256 fingerprint=//g'
s_client 通过 OCSP 检查证书吊销状态
通过 OCSP 检查证书吊销状态
获取要检查是否吊销的证书和颁发者证书
s_client 提取远程服务器证书
  • s_client 默认只显示叶子证书,显示完整证书链需要提供 -showcerts 选项
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > feistyduck.crt
    • echo | openssl s_client -showcerts -connect www.feistyduck.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > feistyduck.crt
  • 配合 x509 工具显示详细的服务器信息及其SHA256指纹
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | openssl x509 -noout -text -fingerprint -sha256
  • 配合 x509 工具进一步提取证书指纹
    • OpenSSL 默认以显示单个字节的格式输出证书,并使用冒号分隔它们
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | openssl x509 -noout -fingerprint -sha256 | sed 's/://g' | tr '[:upper:]' '[:lower:]' | sed 's/sha256 fingerprint=//g'
  • 通过比对证书链上下游的 Subject 和 Issuer 一步步往上回溯
  • 通过 AIA(Authority Info Access)扩展属性获取 CA Issuers 地址或证书
    • CA Issuers - URI:http://crt.comodoca.com/COMODORSADomainValidationSecureServerCA.crt
确定 OCSP 响应程序的 URL
  • 通过 x509 工具从证书中提取
    • openssl x509 -in fd.crt -noout -ocsp_uri
  • 通过 AIA(Authority Info Access)扩展属性获取 OCSP 地址
    • OCSP - URI:http://ocsp.comodoca.com
提交 OCSP 请求并观察响应
  • openssl ocsp -issuer issuer.crt -cert fd.crt -url http://ocsp.comodoca.com -CAfile issuer.crt
    • 部分服务器不处理 nonce,此时需要添加 -no_nonce 选项
    • 返回 404 时尝试在 header 中添加主机名,如 -header Host ocsp.comodoca.com
由客户端发起,要求服务器证书附带 OCSP 响应以证明其有效性
  • 需要客户端在握手阶段提交 status_request 扩展
    • openssl s_client -connect www.feistyduck.com:443 -status
服务器不一定支持 OCSP 响应
  • 不支持的情况下显示 OCSP response: no response sent
  • 支持则会显示完整响应结果
s_client 通过 CRL 检查证书吊销状态
获取要检查是否吊销的证书和颁发者证书
s_client 提取远程服务器证书
  • s_client 默认只显示叶子证书,显示完整证书链需要提供 -showcerts 选项
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > feistyduck.crt
    • echo | openssl s_client -showcerts -connect www.feistyduck.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > feistyduck.crt
  • 配合 x509 工具显示详细的服务器信息及其SHA256指纹
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | openssl x509 -noout -text -fingerprint -sha256
  • 配合 x509 工具进一步提取证书指纹
    • OpenSSL 默认以显示单个字节的格式输出证书,并使用冒号分隔它们
    • echo | openssl s_client -connect www.feistyduck.com:443 2>&1 | openssl x509 -noout -fingerprint -sha256 | sed 's/://g' | tr '[:upper:]' '[:lower:]' | sed 's/sha256 fingerprint=//g'
  • 通过比对证书链上下游的 Subject 和 Issuer 一步步往上回溯
  • 通过 AIA(Authority Info Access)扩展属性获取 CA Issuers 地址或证书
    • CA Issuers - URI:http://crt.comodoca.com/COMODORSADomainValidationSecureServerCA.crt
确定 CRL 的 URL
  • 通过 x509 工具从颁发者证书中提取
    • openssl x509 -in fd.crt -noout -text | grep -A 5 CRL
      • URI:http://crl.comodoca.com/COMODORSADomainValidationSecureServerCA.crl
    • 一般处于 X509v3 CRL Distribution Points 部分中
获取有效 CRL
  • wget http://crl.comodoca.com/COMODORSADomainValidationSecureServerCA.crl -O comodo.crl
  • 使用颁发者证书验证 CRL 是否有效
    • openssl crl -in comodo.crl -inform DER -CAfile issuer.crt -noout
确定需检查证书的序列号并在 CRL 中查找
  • openssl x509 -in fd.crt -noout -serial
  • openssl crl -in comodo.crl -inform DER -text -noout | grep F47F09B599124B1F08846AC4D71EB0F2
  • openssl crl -in comodo.crl -inform DER -text -noout
    • 转换成人类可读的格式并肉眼查找
 
上一篇
k8s 部署 buildkit 容器镜像构建服务
下一篇
alpine 使用 haproxy 和 keepalived 提供高可用网络

Comments
Loading...