用户使用 `gmssl s_client` 测试国密连接,主要围绕其核心参数和国密双证书的特性展开。我下面整理了它的基本用法与常见场景:
一、gmssl s_client 核心参数及使用方法
常用参数 功能说明 使用场景与示例
connect host:port` 指定要连接的服务端地址和端口 必选参数。例如:`-connect 127.0.0.1:4433` |
cert client_sign.crt` 客户端签名证书文件 双向认证时必须提供。配合 `-key` 使用
key client_sign.key` 客户端签名证书对应的私钥文件 与 `-cert` 指定的证书匹配
dcert client_enc.crt` (可选) 客户端加密证书,用于国密协议 符合国密双证书要求
`-dkey client_enc.key` (可选) 客户端加密证书对应的私钥文件 与 `-dcert` 指定的证书匹配
`-CAfile ca.crt` 指定受信任的根证书文件,用于验证服务端证书 单向和双向认证验证服务端身份时都强烈建议提供
`-cipher cipher-spec` 指定密码套件,强制使用国密算法 测试国密时必须设置。例如:`-cipher ECC-SM2-SM4-CBC-SM3`
`-gmtls` 显式使用国密协议(GmSSL特有) 告诉客户端遵循国密SSL/TLS协议,而非标准TLS
`-state` 打印SSL会话的状态变更 辅助调试握手细节,排查交互过程问题
`-debug` 打印详细的调试信息,包括握手过程的所有数据 深入排查连接问题时使用
`-verify [depth]` 要求对端(服务端)的证书验证深度 双向认证核心,启用后服务端会验证客户端
关于国密双证书机制(签名证书、加密证书)的更多细节,可以参考《国密证书签发及国密SSL协议通信测试》中的说明。
二、常见测试场景与命令示例
场景一:单向认证
客户端只需验证服务端身份,常用于访问公开的国密HTTPS网站。
bash
# 使用国密密码套件连接服务端,并验证其证书
gmssl s_client -connect test.gmssl.cn:443 -cipher ECC-SM2-SM4-CBC-SM3 -CAfile ca.crt
成功连接后,命令行会输出详细的握手过程,并显示服务端证书链信息。
场景二:双向认证
服务端和客户端需互相验证身份,适用于高安全要求的内部系统或金融支付场景。
bash
# 服务端命令(参考)
gmssl s_server -accept 44330 -gmtls -cert server_sign.crt -key server_sign.key -dcert server_enc.crt -dkey server_enc.key -CAfile ca.crt -verify 1
# 客户端命令(参考)
gmssl s_client -connect localhost:44330 -gmtls -cert client_sign.crt -key client_sign.key -dcert client_enc.crt -dkey client_enc.key -CAfile ca.crt -state
这个过程在《GMSSL National SSL Process Test》文章中有详细的日志输出可供参考。
场景三:本地自测环境
在未配置完整证书链的测试环境,快速验证gmssl客户端与服务端的连通性。
bash
# 连接自签名的本地服务端,跳过证书验证(仅用于测试)
gmssl s_client -connect localhost:8443 -CAfile ca.crt
`-CAfile ca.crt` 参数提供本地CA证书来验证服务端证书,可以避免因证书不受信任而导致的握手失败。
三、常见问题排查
握手失败:如果是握手失败,可以添加 `-state` 或 `-debug` 参数获取更详细的日志输出,定位具体阶段(如证书解析、密码套件协商等)的错误。
密码套件不匹配:确保服务端已启用并正确配置了至少一个国密套件,例如 `ECDHE-SM2-WITH-SMS4-GCM-SM3`。同时确认客户端 `-cipher` 参数指定的套件服务端支持。
证书验证错误:需要检查证书链是否完整,确认服务端证书是由客户端 `-CAfile` 参数中指定的CA签发。同时,也要注意国密双证书(签名证书和加密证书)是否均已正确配置并匹配。
协议版本不兼容:确保服务端和客户端都启用了国密协议(通过`-gmtls`参数或编译选项),避免因协商到标准TLS协议而导致失败。
希望这份指南能帮助你顺利地进行国密连接测试。如果在配置或测试过程中遇到更具体的错误,可以告诉我,我帮你一起分析。