核心是模拟TLS握手以检查证书链、协议版本及加密套件;先验证DNS与端口连通性,再用-showcerts -verify 9 -servername确认证书有效性,通过-tls1_2/-tls1_3测试协议支持,结合输出对照Nginx配置排查链不全、SNI失效等问题。

用 openssl s_client 调试 Nginx 的 HTTPS 配置,核心是模拟真实 TLS 握手过程,观察服务端返回的证书链、支持的协议版本、加密套件等细节。它不依赖浏览器或高级工具,直接暴露底层 TLS 行为,特别适合排查“证书不受信”“连接被拒”“协议不兼容”等问题。
确认目标域名和端口是否可达
在运行 s_client 前,先确保网络层通畅:
- 用
ping example.com或nslookup example.com验证 DNS 解析正常 - 用
telnet example.com 443或nc -zv example.com 443检查 443 端口是否开放且未被防火墙拦截 - 若 Nginx 监听非标准端口(如 8443),需显式指定,否则默认走 443
查看完整证书链与验证结果
执行以下命令可获取服务端发送的全部证书,并触发本地 CA 验证:
openssl s_client -connect example.com:443 -servername example.com -showcerts -verify 9
-
-servername example.com启用 SNI,确保 Nginx 返回正确的虚拟主机证书(尤其多站点共用 IP 时) -
-showcerts打印服务端发送的整个证书链(包括中间证书),而非仅叶证书 -
-verify 9设置验证深度为 9 层,让 OpenSSL 尝试用系统信任库验证整条链;末尾显示Verify return code: 0 (ok)表示验证通过 - 若返回非零码(如 20 = unable to get local issuer certificate),说明中间证书缺失或未正确配置
ssl_trusted_certificate
检查 TLS 协议版本与加密套件支持
分别测试不同协议版本,确认 Nginx 实际启用的协议范围:
- 强制 TLSv1.2:
openssl s_client -connect example.com:443 -servername example.com -tls1_2 - 强制 TLSv1.3:
openssl s_client -connect example.com:443 -servername example.com -tls1_3 - 禁用所有协议后逐个启用,观察是否握手成功;若
-tls1_3失败但-tls1_2成功,说明 Nginx 未启用 TLS 1.3(需检查ssl_protocols TLSv1.2 TLSv1.3;) - 握手成功后,输出中
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384这类行明确标识了协商结果
排查常见 Nginx 配置问题
结合 s_client 输出,对照 Nginx 配置快速定位典型错误:
-
证书链不完整:-showcerts 显示只有叶证书,无中间证书 → 检查
ssl_certificate文件是否已拼接中间证书(cat fullchain.pem privkey.pem > nginx.pem) -
SNI 不生效:对同一 IP 的多个域名请求均返回同一证书 → 确认
ssl_certificate和ssl_certificate_key在对应server{}块内,且listen 443 ssl http2;含ssl参数 -
ALPN 协议异常:HTTP/2 不生效 → 加 -alpn h2 参数测试,若失败则检查 Nginx 是否开启
http_v2模块及listen ... http2; -
OCSP Stapling 未启用:输出中无
OCSP response:字段 → 确认配置含ssl_stapling on;、ssl_stapling_verify on;,且能访问 OCSP 响应服务器


















