用户要全面测试服务端的SSL证书配置,包括协议支持、密码套件、证书有效性、SNI、客户端认证等。需要根据不同的测试目的组合不同的OpenSSL参数,并正确解读输出结果。因此用户通过 OpenSSL 的 s_client 工具模拟客户端连接,可以测试服务端的 SSL证书配置,包括证书链、协议版本、加密套件等。下面说一下详细的步骤和常见场景:
1. 基础连接测试
检查服务端是否监听 SSL/TLS 端口,并查看证书信息:
bash
复制
下载
openssl s_client -connect example.com:443
输出信息:证书详情、会话状态、支持的协议和密码套件。
按 Ctrl+C 退出。
2. 指定 TLS 协议版本
测试服务端是否支持特定 TLS 版本(如 TLS 1.2 或 1.3):
bash
复制
下载
测试 TLS 1.2
openssl s_client
connect example.com:443 -tls1_2
测试 TLS 1.3
openssl s_client
connect example.com:443 -tls1_3
若连接失败,可能服务端禁用了该协议。
3. 检查证书链有效性
强制验证证书链的完整性(需系统信任根证书):
bash
复制
下载
openssl s_client -connect example.com:443 -verify_return_error -CApath /etc/ssl/certs
CApath:指定系统 CA 证书存储路径(如 /etc/ssl/certs 或 /etc/pki/tls/certs)。
若报错 verify error,可能是证书链不完整或根证书不受信任。
4. 测试特定密码套件
验证服务端是否支持指定的加密套件:
bash
复制
下载
openssl s_client -connect example.com:443 -cipher 'ECDHE-ECDSA-AES256-GCM-SHA384'
若连接失败,说明服务端不支持该套件。
查看支持的套件列表:openssl ciphers -v 'ALL:COMPLEMENTOFALL'。
5. 检查 SNI(Server Name Indication)
测试服务端是否支持 SNI(适用于多域名托管):
bash
复制
下载
openssl s_client -connect example.com:443 -servername example.com
若服务端返回的证书与 -servername 指定的域名匹配,则 SNI 配置正确。
6. 调试握手过程
查看详细的 SSL/TLS 握手过程:
bash
复制
下载
openssl s_client -connect example.com:443 -msg -state -debug
msg:显示协议握手消息。
state:打印连接状态变化。
debug:输出调试信息。
7. 测试客户端证书认证
如果服务端要求客户端证书,需提供证书和私钥:
bash
复制
下载
openssl s_client -connect example.com:443 -cert client.crt -key client.key
cert:客户端证书路径。
key:客户端私钥路径。
8. 保存输出到文件
将连接详情保存到文件以便分析:
bash
复制
下载
openssl s_client -connect example.com:443 > ssl_test.log 2>&1
9. 常见问题排查
连接被拒绝:检查端口是否正确、防火墙规则、服务是否运行。
证书验证失败:确认证书链完整、证书未过期、域名匹配。
协议不支持:服务端可能禁用了旧版本 TLS(如 TLS 1.0/1.1)。
示例命令合集
bash
复制
下载
测试 TLS 1.3 和特定密码套件
openssl s_client
connect example.com:443 -tls1_3 -cipher 'TLS_AES_256_GCM_SHA384'
验证证书链并检查 SNI
openssl s_client
connect example.com:443 -verify_return_error -CApath /etc/ssl/certs -servername
example.com
调试握手过程并保存日志
openssl s_client
connect example.com:443 -msg -state -debug > debug.log 2>&1
用户通过上述九个步骤和方法,您可以全面测试服务端的 SSL证书配置,确保其符合安全最佳实践(如禁用弱协议、使用强密码套件、证书有效性等)。