在调试 TLS 配置或测试客户端证书时,我们经常需要一个临时的 HTTPS 服务器。OpenSSL 提供的 s_server 命令可以快速启动一个测试 TLS 服务器,无需复杂的配置。
本文将详细介绍 s_server 的各种用法,帮助你在调试和测试中提高效率。
快速启动 HTTPS 服务器#
最简单的用法#
只需要指定证书和私钥文件,即可启动一个 HTTPS 服务器:
1
|
openssl s_server -cert server.crt -key server.key -www
|
启动后,访问 https://localhost:4433/ 会看到一个状态页面,显示服务器支持的 TLS 版本和密码套件。
如果你没有现成的证书,可以快速生成一个自签名证书:
1
2
|
# 生成测试用证书
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=Test Server"
|
常用端口和地址#
默认端口是 4433。如果需要使用标准 HTTPS 端口 443,需要 root 权限:
1
2
3
4
5
|
# 监听 443 端口(需要 root 权限)
openssl s_server -cert server.crt -key server.key -www -port 443
# 监听特定地址
openssl s_server -cert server.crt -key server.key -www -accept 192.168.1.100:8443
|
测试 TLS 版本和密码套件#
限制 TLS 版本#
可以限制服务器只支持特定的 TLS 版本:
1
2
3
4
5
6
7
8
|
# 只支持 TLS 1.2
openssl s_server -cert server.crt -key server.key -www -tls1_2
# 只支持 TLS 1.3
openssl s_server -cert server.crt -key server.key -www -tls1_3
# 指定协议版本范围
openssl s_server -cert server.crt -key server.key -www -min_protocol TLSv1.2 -max_protocol TLSv1.3
|
限制密码套件#
可以指定服务器只支持特定的密码套件:
1
2
3
4
5
|
# 限制 TLS 1.2 密码套件
openssl s_server -cert server.crt -key server.key -www -cipher "ECDHE-RSA-AES256-GCM-SHA384"
# 限制 TLS 1.3 密码套件
openssl s_server -cert server.crt -key server.key -www -ciphersuites "TLS_AES_256_GCM_SHA384"
|
使用 -www 选项启动服务器后,访问服务器会返回支持的密码套件列表,方便验证配置是否生效。
客户端证书验证#
s_server 支持双向 TLS 认证(mTLS),可以要求客户端提供证书。
启动需要客户端证书验证的服务器#
1
|
openssl s_server -cert server.crt -key server.key -www -CAfile ca.crt -verify 1
|
其中:
-CAfile ca.crt:指定用于验证客户端证书的 CA 证书
-verify 1:启用客户端证书验证
测试客户端证书验证#
使用 s_client 带客户端证书连接:
1
2
|
# 需要提供客户端证书和私钥
openssl s_client -connect localhost:4433 -cert client.crt -key client.key
|
如果不提供客户端证书(或证书不被信任),连接会失败或返回验证错误。
强制要求客户端证书#
如果需要强制要求客户端必须提供有效证书(否则拒绝连接),使用大写的 -Verify:
1
|
openssl s_server -cert server.crt -key server.key -www -CAfile ca.crt -Verify 1
|
使用场景示例#
快速测试 TLS 配置#
部署新的 TLS 配置后,使用 s_server 快速验证:
1
2
3
4
5
|
# 启动测试服务器
openssl s_server -cert server.crt -key server.key -www -tlsextdebug
# 从另一个终端测试连接
openssl s_client -connect localhost:4433 -servername example.com
|
-tlsextdebug 选项会在终端输出接收到的 TLS 扩展信息,有助于调试 TLS 扩展相关问题。
测试密码套件兼容性#
验证客户端和服务器的密码套件兼容性:
1
2
3
4
5
|
# 限制只使用一个密码套件
openssl s_server -cert server.crt -key server.key -cipher "ECDHE-RSA-AES256-GCM-SHA384"
# 使用特定密码套件连接
openssl s_client -connect localhost:4433 -cipher "ECDHE-RSA-AES256-GCM-SHA384"
|
调试证书链问题#
使用 -serverinfo 选项加载服务器端信息:
1
|
openssl s_server -cert server.crt -key server.key -serverinfo serverinfo.pem -www
|
导出密钥材料#
测试 TLS 1.3 的密钥导出功能:
1
|
openssl s_server -cert server.crt -key server.key -keymatexport keyMaterial -keymatexportlen 32
|
然后使用 s_client 的 -keymatexport 选项导出相同的密钥材料进行验证。
结合 curl 测试#
使用 curl 可以更方便地进行 HTTP 层测试:
1
2
3
4
5
6
7
8
9
10
11
|
# 启动服务器
openssl s_server -cert server.crt -key server.key -www &
# 使用 curl 测试(-k 跳过证书验证)
curl -k https://localhost:4433/
# 启用详细输出
curl -kv https://localhost:4433/
# 测试客户端证书
curl -k --cert client.crt --key client.key https://localhost:4433/
|
常用选项汇总#
| 选项 |
说明 |
-cert |
服务器证书文件 |
-key |
服务器私钥文件 |
-CAfile |
CA 证书文件(用于验证客户端证书) |
-www |
响应 GET / 请求,返回状态页面 |
-port / -accept |
指定监听端口 |
-cipher |
TLS 1.2 密码套件 |
-ciphersuites |
TLS 1.3 密码套件 |
-tls1_2 / -tls1_3 |
限制 TLS 版本 |
-min_protocol / -max_protocol |
指定协议版本范围 |
-verify |
启用客户端证书验证 |
-Verify |
强制要求客户端证书 |
-tlsextdebug |
输出 TLS 扩展调试信息 |
-quiet |
静默模式,不输出服务器信息 |
注意事项#
- 仅用于测试:
s_server 是调试工具,不适合作为生产环境服务器
- 自签名证书:使用自签名证书时,客户端需要跳过证书验证或添加信任
- 默认端口:默认端口是 4433,避免与现有服务冲突
- 安全考虑:测试完成后及时停止服务器,清理测试证书
s_server 是 OpenSSL 工具箱中非常实用的命令,可以快速搭建测试 TLS 服务器,用于:
- 验证 TLS 配置是否正确
- 测试客户端证书认证
- 调试 TLS 握手问题
- 检查服务器支持的密码套件和 TLS 版本
相比复杂的测试环境,s_server 只需一行命令即可启动,非常适合快速验证和调试场景。
参考来源#