openssl s_client 是排查 https 配置问题最轻量可靠的方式,可验证证书链完整性(-showcerts)、tls 版本兼容性(-tls1_2/-tls1_3)、密码套件协商(-debug -msg)、alpn 协议(h2/http/1.1)及旧客户端兼容性(如 seclevel=1)。

用 openssl s_client 可以直接与 Nginx 服务器建立 TLS 连接,查看实际返回的证书链、支持的协议版本、密码套件和扩展信息,是排查 HTTPS 配置问题最轻量也最可靠的方式。
确认基础连接与证书链完整性
运行以下命令可获取完整证书链并验证是否可信:
openssl s_client -connect example.com:443 -servername example.com -showcerts
重点关注三部分:
-
Certificate chain:检查是否包含全部中间证书(通常 2–3 张),若只有一张且是域名证书,说明 Nginx 未配置
ssl_trusted_certificate或未在ssl_certificate文件中拼接中间证书 - Verify return code:应为 0(OK)。若为 21(unable to verify the first certificate),大概率是证书链缺失或顺序错误
- subject= / issuer= 行:逐级核对 issuer 是否匹配下一张证书的 subject,确保链路连贯
检测 TLS 协议版本与兼容性
强制指定协议版本,观察是否能成功握手:
openssl s_client -connect example.com:443 -tls1_2openssl s_client -connect example.com:443 -tls1_3openssl s_client -connect example.com:443 -tls1
若某版本连接失败(如报错 ssl handshake failure),说明 Nginx 的 ssl_protocols 未启用该版本。注意:-tls1_3 在 OpenSSL 1.1.1+ 才支持;旧版本需用 -ciphersuites 配合测试。
查看服务端协商的密码套件与扩展
添加 -debug 和 -msg 参数可看到更底层交互细节:
openssl s_client -connect example.com:443 -tls1_2 -debug -msg 2>/dev/null | grep -E "(Cipher|ALPN|supported.*versions|key_share)"
关键信息包括:
-
Cipher:显示最终选中的加密套件,比对 Nginx 的
ssl_ciphers配置是否生效 -
ALPN protocol:确认是否协商出
h2(HTTP/2)或http/1.1,关系到http_v2指令是否生效 - supported_versions(TLS 1.3)或 key_share:验证是否启用 TLS 1.3 关键扩展
模拟旧客户端行为定位兼容问题
某些问题仅在特定客户端出现,可用低版本参数复现:
openssl s_client -connect example.com:443 -cipher 'DEFAULT@SECLEVEL=1'openssl s_client -connect example.com:443 -cipher 'ECDHE+AESGCM:RSA+AESGCM'
例如 SECLEVEL=1 允许 SHA-1 签名(对应老旧 Android 4.x),若此时握手成功而默认失败,说明证书签名算法或密钥交换不满足当前 OpenSSL 安全等级,需检查 ssl_ecdh_curve 或证书密钥长度。











