s_server 是干什么的
openssl s_server 用本地证书起一个临时 TLS 服务端,用来验证客户端一侧的行为:客户端证书能不能通过校验、协商到哪个版本和套件、握手在哪一步失败。加上 -www 后它会返回一段简单 HTTP 响应,方便直接拿 curl 或浏览器做端到端验证;-state 与 -msg 把握手状态机和消息明细打到终端,是复现「只有某个客户端连不上」这类问题的常用手段。
基本信息
| 适用平台 | Linux / macOS / Windows 的 OpenSSL 命令行 |
|---|---|
| 启动 | openssl s_server -accept 8443 -cert fullchain.pem -key key.pem -www |
| 校验客户端 | -Verify 1 -CAfile ca.pem 要求并校验客户端证书 |
| 调试输出 | -state 看状态机,-msg 看握手消息,-tlsextdebug 看扩展 |
| 限定版本套件 | -tls1_3、-ciphersuites、-groups 控制协商范围 |
| 定位 | 调试与验证工具,不作生产服务 |
典型使用场景
- 复现客户端报错:把生产证书放到本地,看还能不能重现握手失败。
- 验证 mTLS 配置:检查客户端证书是否被正确请求与校验,以及链是否完整。
- 核对协议版本:确认某个老旧客户端是否只能在 TLS 1.2 上工作。
- 扩展行为验证:观察 SNI、ALPN、会话票据在真实握手中的表现。
- 证书链调试:快速试验只发叶证书、发完整链两种情形下的差异。
启动测试服务端并连接
启动测试服务端并连接
openssl s_server -accept 8443 -cert server.crt -key server.key -www
# 另开一个终端连接,观察协商结果
openssl s_client -connect 127.0.0.1:8443 -CAfile ca.pem </dev/null | head -15
# 需要校验客户端证书时
# openssl s_server -accept 8443 -cert server.crt -key server.key -Verify 1 -CAfile ca.pem -www
# 用 curl 做端到端验证
# curl -k --resolve test.local:8443:127.0.0.1 https://test.local:8443/常用选项读法
| 选项 | 作用 | 典型用途 |
|---|---|---|
| -accept | 指定监听端口 | 避免与 443 冲突,用 8443 一类高位端口 |
| -www | 对每个请求返回简单页面 | 配合 curl 做快速连通验证 |
| -Verify 1 | 要求客户端证书且校验失败即中断 | 验证 mTLS 链路 |
| -state / -msg | 打印状态机与握手消息 | 定位卡在握手哪一步 |
| -groups | 限制密钥交换组 | 复现 HRR 或组不匹配问题 |
| -keylogfile | 导出会话密钥 | 用 Wireshark 解密自己造的流量 |
本地复现时固定 OpenSSL 版本、协议版本与套件组合,比在生产环境反复试更容易区分是客户端问题还是服务端配置问题。