用户使用  `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协议而导致失败。

希望这份指南能帮助你顺利地进行国密连接测试。如果在配置或测试过程中遇到更具体的错误,可以告诉我,我帮你一起分析。