4. 密码协议交互测试

密码协议交互测试的核心,不是“端口通不通”,而是验证协议在握手、密钥交换、身份认证、记录层保护四个关键阶段是否按规范执行,以及在异常输入、状态跳变、参数篡改等条件下能否正确拒绝或安全降级。TLS/SSL、IPSec、SSH 三类协议虽然应用场景不同,但测试思路高度一致:先确认协议版本与算法套件,再验证密钥交换与认证绑定,最后检查记录层加密与完整性保护是否真正生效。

一、TLS/SSL:从 ClientHello 到记录层保护

TLS 握手是典型的“协商—认证—密钥派生—切换加密”过程。以 TLS 1.3 为例,客户端发送 ClientHello,携带支持的版本、密码套件、密钥共享(key_share)和签名算法;服务端回复 ServerHello,选定参数并返回自己的 key_share,随后发送 EncryptedExtensions、Certificate、CertificateVerify、Finished。客户端验证证书链和 CertificateVerify 签名后,双方基于 ECDHE 共享秘密派生出握手密钥和应用密钥,Finished 消息用握手密钥保护,验证通过后进入应用数据阶段。

测试时,首先要覆盖协议版本与密码套件。例如使用 openssl s_client -connect 10.0.0.20:443 -tls1_3 -ciphersuites TLS_AES_128_GCM_SHA256 观察是否成功协商;再尝试 -tls1_1 或弱套件如 TLS_RSA_WITH_AES_128_CBC_SHA,预期应被拒绝。若服务端仍接受 TLS 1.0/1.1 或 RSA 密钥传输套件,说明存在降级风险。

其次要验证证书与认证。检查证书链是否完整、主机名是否匹配、有效期是否合理、是否使用 SHA-1 签名、密钥长度是否低于 2048 位(RSA)或 256 位(ECC)。可用 openssl s_client -connect 10.0.0.20:443 -verify_return_error -CAfile ca.pem 强制校验,若返回 verify error 则说明认证链存在问题。

记录层测试关注加密与完整性是否真正生效。抓包后若能看到明文 HTTP 内容,说明记录层未加密或密钥协商失败后回退到明文;若看到大量 Application Data 且无法解密,则符合预期。还需测试重放、篡改和截断:修改记录层 MAC 或 AEAD tag 后,接收方应丢弃并可能发送 bad_record_mac 告警。

TLS 1.3 握手与记录层测试关注点 客户端 Client ClientHello 版本/套件/key_share 验证 Certificate 链/主机名/有效期 验证 CertificateVerify 签名算法与绑定 发送 Finished 握手密钥保护 应用数据 AEAD 加密+完整性 服务端 Server ServerHello 选定套件/key_share Certificate 证书链 CertificateVerify 私钥签名 Finished 握手密钥保护 应用数据 AEAD 解密+校验 ClientHello ServerHello + 证书 + CertificateVerify Finished(握手密钥保护) Finished(握手密钥保护) Application Data(AEAD 加密) 异常路径测试点 弱套件/降级版本 → 应拒绝 证书链错误/主机名不匹配 → 应告警 篡改 Finished/MAC → bad_record_mac

二、IPSec:IKE 与 ESP 的分层验证

IPSec 测试分为 IKE 阶段和 ESP 阶段。IKEv2 使用 IKE_SA_INIT 交换 DH 公钥和 nonce,随后 IKE_AUTH 完成身份认证(预共享密钥、证书或 EAP),并建立 Child SA。测试时可用 strongSwan 的 ipsec statusall 查看 SA 状态,确认 ESTABLISHED 后检查加密算法是否为 AES_GCM_16 或 AES_CBC + HMAC_SHA2_256。

ESP 层测试重点在于:加密是否覆盖载荷、完整性校验是否覆盖整个 ESP 包、抗重放窗口是否生效。可构造重放包观察接收端是否丢弃;修改 SPI 或序列号后,SA 查找应失败。若使用传输模式,需确认原始 IP 头未被加密;隧道模式下则整个内层 IP 包都应被保护。

三、SSH:密钥交换、认证与通道复用

SSH 协议先进行版本交换,再协商密钥交换算法(如 curve25519-sha256)、主机密钥算法(如 ssh-ed25519)、加密算法(如 chacha20-poly1305@openssh.com)和 MAC 算法。测试时可用 ssh -vvv user@10.0.0.30 观察协商结果,确认未使用 diffie-hellman-group1-sha1 等弱算法。

认证阶段需覆盖公钥、密码、键盘交互等方式,并验证失败次数限制、账户锁定策略。通道阶段测试端口转发、X11 转发、SFTP 子系统是否按策略开放。异常路径包括:篡改 KEX 初始化包、发送非法通道请求、超长用户名等,服务端应返回 SSH_MSG_DISCONNECT 并记录日志。

四、协议状态机与异常路径覆盖

协议测试不能只走“正常路径”。应建立状态机模型,列出每个状态允许的消息类型和迁移条件,然后针对非法迁移设计用例。例如 TLS 中在 ClientHello 后直接发送 Application Data,或在 Finished 前发送应用数据,服务端应拒绝。IPSec 中在 IKE_SA_INIT 未完成时发送 IKE_AUTH,应返回错误。SSH 中在密钥交换未完成时发送通道请求,应断开连接。

异常路径覆盖建议采用“状态×消息×参数”三维矩阵:状态包括初始、协商中、认证中、已建立、关闭中;消息包括合法消息、乱序消息、重复消息、畸形消息;参数包括边界值、非法值、缺失字段。每个组合至少设计一个用例,并记录预期响应(拒绝、告警、断开、忽略)和实际响应。

测试记录建议:每条用例记录协议版本、协商算法、证书/密钥信息、异常输入、预期状态迁移、实际状态迁移、告警或日志片段。对于 TLS,可保存 openssl s_client 输出和 tcpdump 抓包;对于 IPSec,保存 ipsec statusall 和 ip xfrm state;对于 SSH,保存 ssh -vvv 日志和服务端 sshd 日志。

最后,协议交互测试的结论应落到“是否可安全上线”的判断上:若存在弱算法可协商、证书校验可绕过、异常路径导致进程崩溃或状态泄漏,则必须修复后复测。只有正常路径与异常路径均通过,协议实现才具备基本的健壮性与安全性。