GM/T 0129-2023 SSH密码协议规范:国密算法扩展、密码套件协商与实现架构
概述
GM/T 0129-2023《SSH密码协议规范》于 2023 年 12 月 4 日发布,2024 年 6 月 1 日正式实施,由国家密码管理局主管部门主管。该标准在 SSH 协议(RFC 4253)基础上增加了对国密算法(SM2、SM3、SM4)的支持,定义了国密 SSH 的完整协议框架。
标准发布后,国密 SSH 的实现有了统一的规范依据。目前已有开源社区(如 OpenEuler libssh2、GMSSL 等)基于该标准实现了国密 SSH 的支持。
标准定位
| 属性 | 说明 |
|---|---|
| 标准编号 | GM/T 0129-2023 |
| 英文名称 | Secure shell cryptography protocol specification |
| 发布日期 | 2023-12-04 |
| 实施日期 | 2024-06-01 |
| 主管部门 | 国家密码管理局 |
| 备案号 | 94558-2024 |
| 中国标准分类号 | CCS L80 |
| 国际标准分类号 | ICS 35.030 |
| 相近标准 | GB/T 38636-2020(TLCP)、GM/T 0024-2023(SSL VPN) |
协议版本标识
GM/T 0129-2023 定义了国密 SSH 的版本标识字符串:
CSSH-<protoversion>-<softwareversion>[SP <comments>]CR LFCSSH:本规范的简称:协议版本号,固定为1.0:软件名称和版本号,由实现者定义(不可含有空格和减号):可选注释字段
CSSH-1.0-MySSH3.3 This is comment CR LF协议框架
GM/T 0129-2023 在 SSH 协议的三层架构基础上进行了国密扩展。SSH 协议原本由三个子协议组成:
传输层协议(Transport Layer Protocol)
传输层协议提供以下安全服务:
- 服务端鉴别:客户端验证服务端的身份
- 机密性:通过加密算法保护数据传输的机密性
- 完整性:通过 MAC 算法保护数据不被篡改
- 密钥交换:双方协商共享密钥
用户鉴别协议(User Authentication Protocol)
用户鉴别协议用于服务端鉴别客户端用户的身份,支持多种鉴别方式:
- 密码鉴别:基于用户名密码
- 公钥鉴别:基于 SM2/RSA/ECC 数字签名挑战响应
- 键盘交互鉴别:支持多因素认证
连接协议(Connection Protocol)
连接协议将加密通道复用为若干逻辑信道,支持:
- 会话(session):远程命令执行
- 端口转发(forwarded-tcpip):TCP 端口转发
- X11 转发:图形界面转发
- 远程执行命令
国密算法扩展
GM/T 0129-2023 在 SSH 协议中新增的算法类型包括三大类:加密算法、密钥交换算法和签名算法。
加密算法
标准定义了 SM4 系列加密算法(第 10-11 页表 4):
| 算法名称 | 描述 | 支持要求 |
|---|---|---|
| SM4-CBC | SM4 算法 CBC 工作模式 | 必选 |
| SM4-CFB | SM4 算法 CFB 工作模式 | 可选 |
| SM4-CTR | SM4 算法 CTR 工作模式 | 可选 |
| SM4-OFB | SM4 算法 OFB 工作模式 | 可选 |
| SM4-CCM | SM4 算法 CCM 工作模式(可鉴别加密) | 可选 |
| SM4-KW | SM4 算法 Key Wrap 工作模式(可鉴别加密) | 可选 |
| SM4-GCM | SM4 算法 GCM 工作模式(可鉴别加密) | 可选 |
注意:SM4-CBC 是唯一必选算法,其余模式为可选扩展。GCM 和 CCM 模式提供 AEAD(认证加密)能力,在需要完整性保护时推荐使用。
密钥交换算法
密钥交换算法用于双方安全地协商共享密钥。SSH 标准(RFC 4253)定义了多种密钥交换算法,GM/T 0129-2023 在此基础上增加了基于 SM2 的密钥交换。
常见密钥交换算法包括:
| 算法名称 | 数学基础 | 前向安全性 | 说明 |
|---|---|---|---|
| curve25519-sha256 | Curve25519 ECDH | ✅ | 国际主流 |
| ecdh-sha2-nistp256 | NIST P-256 ECDH | ✅ | NIST 标准曲线 |
| diffie-hellman-group-exchange-sha256 | DH | ✅ | 传统 DH |
| sm2keyexchange | SM2 密钥交换 | ✅ | 国密扩展 |
签名算法
签名算法用于用户鉴别和挑战-响应机制。GM/T 0129-2023 支持的签名算法包括:
| 算法名称 | 标准依据 | 说明 |
|---|---|---|
| ssh-rsa | RFC 8332 | RSA 签名 |
| ecdsa-sha2-nistp256 | RFC 5656 | NIST P-256 曲线 |
| ssh-ed25519 | RFC 8709 | EdDSA 签名 |
| sm2sig-sm3 | GM/T 0003.2 | SM2 数字签名 + SM3 哈希 |
密码套件协商机制
密码套件协商是 SSH 握手过程中最核心的环节。GM/T 0129-2023 沿用了 SSH 协议的经典协商模式。
协商原则
核心规则:客户端按优先级排序推荐算法列表,服务端选择列表中第一个自身支持的算法。这一原则在 RFC 4253 Section 7.1 中明确规定:
"The chosen encryption algorithm to each direction MUST be the first algorithm on the client's name-list that is also on the server's name-list."GM/T 0129-2023 第 12 页 8.5.1 进一步明确:
"双方发送支持的算法名称列表。名称列表中的第一个为首选算法。双方在列表中选择第一个与对方达成一致的算法作为密钥协商算法。"
协商流程
SSH_MSG_KEXINIT 消息是协商的核心载体:
客户端 服务端
│ │
│──── SSH_MSG_KEXINIT ──────────────────→│
│ [客户端支持的算法列表] │
│ kex_algorithms: [sm2keyexchange, │
│ ecdh-sha2-nistp256, │
│ ...] │
│ server_host_key_algorithms: │
│ [sm2sig-sm3, ssh-ed25519, ...] │
│ encryption_algorithms_client_to_server: │
│ [sm4-gcm, sm4-ctr, ...] │
│ encryption_algorithms_server_to_client: │
│ [sm4-gcm, sm4-ctr, ...] │
│ │
│←──── SSH_MSG_KEXINIT ──────────────────│
│ [服务端选择的算法] │
│ (从客户端列表中选首个匹配项) │
│ │
│──── SSH_MSG_KEX_REPLY / 密钥交换消息 ──→│
│ │
│←──── 密钥交换响应 ──────────────────────│
│ │
│ [加密通道建立完成] │协商示例
假设客户端和服务端各自支持的加密算法列表如下:
客户端列表(优先级从高到低):
chacha20-poly1305@openssh.comaes256-gcm@openssh.comaes256-ctraes192-ctrsm4-ctr
aes256-ctrsm4-gcmaes128-ctrsm4-ctraes256-cbc
| 步骤 | 检查算法 | 服务端是否支持 | 结果 |
|---|---|---|---|
| 1 | chacha20-poly1305@openssh.com | ❌ 不支持 | 跳过 |
| 2 | aes256-gcm@openssh.com | ❌ 注意:服务端支持 sm4-gcm 而非 aes256-gcm | 跳过 |
| 3 | aes256-ctr | ✅ 支持(服务端列表第 1 位) | 匹配成功 |
aes256-ctr。关键点:SSH 协商以客户端列表为基准,从高到低逐个检查,选择第一个在服务端列表中也存在的算法。即使服务端最高优先级也是 aes256-ctr,但决定因素是它在客户端列表中首次能被匹配的位置。
国密算法协商策略
如果需要强制使用国密算法,客户端应将 SM 系列算法放在列表首位:
客户端配置示例(强制国密):
sm4-gcm ← 首选国密
sm4-ctr ← 备选国密
aes256-ctr ← 国际算法兜底扩展协商机制(RFC 8308)
GM/T 0129-2023 支持 SSH 扩展协商机制(RFC 8308),通过 SSH_MSG_EXT_INFO 消息实现握手完成后的算法能力通告。
扩展协商流程
- 客户端在
SSH_MSG_KEXINIT的kex_algorithms字段中添加ext-info-c - 服务端在
SSH_MSG_KEX_INIT的kex_algorithms字段中添加ext-info-s - 密钥交换完成后,接收方发送
SSH_MSG_EXT_INFO消息 - 扩展信息包含扩展名称和扩展数据
国密相关扩展
| 扩展名称 | 说明 | 国密用途 |
|---|---|---|
| server-sig-algs | 服务端支持的签名算法列表 | 协商 SM2 签名算法 |
| publickey-bound | 绑定公钥的会话 ID | 安全增强 |
| no-flow-control | 禁用流量控制 | 性能优化 |
server-sig-algs 扩展在国密场景中尤为重要:服务端通过此扩展告知客户端自己支持 sm2sig-sm3 等国算法签名算法,客户端可据此选择合适的鉴别方式。与 GB/T 38636-2020(TLCP)的对比
GM/T 0129-2023(SSH 国密扩展)和 GB/T 38636-2020(TLCP,传输层密码协议)都是国密传输层安全协议,它们在很多方面存在有趣的对比:
协议定位对比
| 维度 | GM/T 0129-2023(SSH) | GB/T 38636-2020(TLCP) |
|---|---|---|
| 基础协议 | SSH(RFC 4253 系列) | TLS 1.1 变体 |
| 主要场景 | 远程登录、命令执行、端口转发 | Web HTTPS、通用传输加密 |
| 协议版本 | CSSH 1.0 | TLCP 1.1(版本号 0x0101) |
| 握手 RTT | 2-RTT | 2-RTT |
| 前向安全性 | 可选(ECDH) | 可选(ECDHE) |
密码套件对比
| 特性 | SSH(GM/T 0129) | TLCP(GB/T 38636) |
|---|---|---|
| 套件命名 | 按算法类型分开协商 | 密钥交换_加密_模式_校验 组合 |
| 密钥交换 | 独立协商 | 包含在套件中 |
| 加密模式 | CBC/GCM/CTR/CCM 等 | CBC/GCM |
| AEAD 支持 | GCM、CCM | GCM |
| SM4 模式 | 7 种(CBC 必选) | 2 种(CBC、GCM) |
TLCP 定义的密码套件
GB/T 38636-2020 的密码套件命名格式为:密钥交换算法_对称加密算法_加密模式_完整性校验算法
| 套件名称 | 密钥交换 | 加密 | 校验 | 值 |
|---|---|---|---|---|
| ECDHE_SM4_CBC_SM3 | ECDHE | SM4-CBC | SM3 | {0xe0,0x11} |
| ECDHE_SM4_GCM_SM3 | ECDHE | SM4-GCM | SM3 | {0xe0,0x51} |
| ECC_SM4_CBC_SM3 | ECC | SM4-CBC | SM3 | {0xe0,0x13} |
| ECC_SM4_GCM_SM3 | ECC | SM4-GCM | SM3 | {0xe0,0x53} |
| IBSDH_SM4_CBC_SM3 | IBSDH | SM4-CBC | SM3 | {0xe0,0x15} |
| IBSDH_SM4_GCM_SM3 | IBSDH | SM4-GCM | SM3 | {0xe0,0x55} |
| IBC_SM4_CBC_SM3 | IBC | SM4-CBC | SM3 | {0xe0,0x17} |
| IBC_SM4_GCM_SM3 | IBC | SM4-GCM | SM3 | {0xe0,0x57} |
协商机制对比
| 维度 | SSH | TLCP | TLS 1.3 |
|---|---|---|---|
| 列表发送 | 客户端和服务端各自发送 | 仅客户端发送 | 仅客户端发送 |
| 选择规则 | 客户端列表中首个在服务端列表中存在的 | 服务端选择客户端列表中首个支持的 | 服务端选择客户端列表中首个支持的 |
| 失败处理 | 断开连接 | handshake_failure | handshake_failure |
安全分析
已知攻击与防护
| 攻击类型 | 风险 | 防护措施 |
|---|---|---|
| 中间人攻击 | 攻击者冒充服务端 | 服务端公钥指纹验证(首次连接信任) |
| 降级攻击 | 强制使用弱算法 | 服务端限制支持的算法列表 |
| Terrapin 攻击 | 前缀截断攻击 | 使用严格的密钥交换(strict kex) |
| 密钥泄露 | 长期密钥被窃取 | 使用前向安全密钥交换(ECDHE) |
国密算法安全强度
| 算法 | 安全强度 | 等效国际标准 |
|---|---|---|
| SM2-256 | 128 位 | NIST P-256 / Curve25519 |
| SM3-256 | 256 位(哈希输出) | SHA-256 |
| SM4-128 | 128 位 | AES-128 |
实现状态
GM/T 0129-2023 发布后,国密 SSH 的实现生态正在快速发展:
- libssh2:OpenEuler 社区已基于 GM/T 0129-2023 实现了国密 SSH 支持,包括 SM2/SM3/SM4 算法套件
- GMSSL:提供国密 SSL/TLS 和 SSH 支持
- BabaSSL:基于 OpenSSL 的国密算法支持,包含 ECDHE-SM2 密钥交换
参考来源
- GM/T 0129-2023 全国标准信息公共服务平台
- GM/T 0129-2023 PDF(标准全文)
- RFC 4253 - SSH Transport Layer Protocol
- RFC 8308 - SSH Extension Negotiation
- GB/T 38636-2020 传输层密码协议(TLCP)
- OpenEuler libssh2 国密支持
- TLCP & SSH 密码套件协商实战
相关实践
- 如需了解国密 TLS 协议(GM/T 0024)的详细流程,请参阅《国密 TLS 1.1 协议详解:GM/T 0024 与 RFC 8998》
- 如需了解 SM2 密钥交换协议的数学原理,请参阅《SM2 椭圆曲线公钥密码算法》
- 如需了解 SM4 加密算法的各种工作模式,请参阅《SM4 分组密码算法原理详解》
- 如需了解国密 HTTPS 部署中的 TLS 配置实践,请参阅《SM2 国密算法实战:从编译国密 OpenSSL 到生产级 TLS 部署全流程》