在调试 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 静默模式,不输出服务器信息

注意事项

  1. 仅用于测试s_server 是调试工具,不适合作为生产环境服务器
  2. 自签名证书:使用自签名证书时,客户端需要跳过证书验证或添加信任
  3. 默认端口:默认端口是 4433,避免与现有服务冲突
  4. 安全考虑:测试完成后及时停止服务器,清理测试证书

小结

s_server 是 OpenSSL 工具箱中非常实用的命令,可以快速搭建测试 TLS 服务器,用于:

  • 验证 TLS 配置是否正确
  • 测试客户端证书认证
  • 调试 TLS 握手问题
  • 检查服务器支持的密码套件和 TLS 版本

相比复杂的测试环境,s_server 只需一行命令即可启动,非常适合快速验证和调试场景。


参考来源