远程桌面「由于数据加密错误」排障经验
归档:2026-10-17 | 环境:Windows Server 2012 + win10 客户端 根因:服务器开启了系统级 FIPS 加密策略,迫使 RDP 使用 3DES;新版客户端不支持该算法,自行断开。
一、结论
关闭服务器端的系统级 FIPS 加密策略即可恢复。此开关位于操作系统层,优先级高于组策略、高于注册表,能覆盖所有 RDP 应用层加密设置。
二、修复步骤
方法 A(图形化)
secpol.msc → 本地策略 → 安全选项
→ 「系统加密: 使用符合 FIPS 140-1 的算法进行加密、哈希和签名」
→ 改为「已禁用」
方法 B(注册表)
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy
→ Enabled = 0
⚠️ 改完重启服务器(实际操作中使用图形化更改后,未重启,设置生效)。
本次环境保留的约束:会话安全层固定为 RDP、NLA 保持禁用。
三、故障机理
服务器启用系统级 FIPS
↓
TermService 强制使用 FIPS140-1 3DES 加密
↓
客户端自称支持 FIPS → 服务器选中该加密方式
↓
新版 Windows 客户端实际不支持 RDP 标准安全层的 3DES
↓
无法解密服务器返回的数据 → 客户端主动断开
↓
报错「由于数据加密错误,这个会话将结束」
老版本客户端(Win7 / Win2008 / 服务器自带 mstsc)不触发这套协商,因此可以正常远程。
四、排查要点
1. 交叉测试
| 测试 | 目的 |
|---|---|
服务器本机 mstsc → 127.0.0.1 | 判断服务器端服务是否完好 |
| 用一台旧版 Windows 去连 | 判断是否为客户端协议代差 |
| 在客户机上开Win7 虚拟机去连 | 同机同网卡,排除网络/防火墙/MTU |
三个维度的成败组合,能直接指向「服务器 / 网络 / 客户端」中的哪一端,避免盲目改配置。
2. 事件日志
事件查看器 → 应用程序和服务日志 → Microsoft → Windows
→ TerminalServices-LocalSessionManager → Operational
| 事件 ID | 含义 |
|---|---|
| 21 | 登录成功(证明认证已通过) |
| 36(错误) | 会话状态机转换失败,含关键 ErrorCode |
| 40 | 会话断开 |
本次 Event 36 为
错误代码 0x800708CA。更下层细节看RemoteDesktopServices-RdpCoreTS → Operational。
3. 抓包(关键)
# 抓包
tshark -i <接口> -f "tcp port 3389" -w out.pcapng -a duration:600
# 关键:看谁发 RST(判断服务端/客户端责任)
tshark -r out.pcapng -Y "tcp.flags.reset==1" -T fields -e frame.number -e ip.src -e _ws.col.Info
# 关键:看服务器实际下发的加密方式
tshark -r out.pcapng -V | grep -iE "encryptionMethod|encryptionLevel|failureCode"
| 抓包所见 | 处理方向 |
|---|---|
failureCode: TLS not allowed by server | 服务器被锁 SecurityLayer=0,需业务放开或走兼容绕行 |
encryptionMethod: FIPS140-1 3DES | 关闭系统级 FIPS(本次根因) |
| RST 由服务器发出 | 查 Licensing / 会话数 / TermDD |
| RST 由客户端发出 | 查客户端加密能力、系统更新、凭据缓存 |
五、关键配置速查
| 项目 | 注册表路径 | 取值 |
|---|---|---|
| 系统级 FIPS | HKLM\SYSTEM\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled | 0=关 / 1=开(本次元凶) |
| 会话安全层 | ...\Control\Terminal Server\WinStations\RDP-Tcp\SecurityLayer | 0=RDP / 1=协商 / 2=SSL |
| 加密级别 | 同路径 MinEncryptionLevel | 1=低 / 2=兼容 / 3=高级 / 4=FIPS |
| NLA | 同路径 UserAuthentication | 0=禁用 / 1=启用 |
| 证书绑定 | 同路径 SSLCertificateSHA1Hash | 证书指纹二进制 |
⚠️
MinEncryptionLevel = 2(客户端兼容)有陷阱:服务器会挑选客户端自称支持的最强加密,而新版客户端支持 FIPS,容易意外落到 3DES。要强制 128 位应选3(高级)。
组策略路径
远程桌面会话主机 → 安全 → 远程(RDP)连接要求使用指定的安全层
远程桌面会话主机 → 安全 → 设置客户端连接加密级别
远程桌面会话主机 → 连接 → 选择 RDP 传输协议
secpol.msc → 安全选项 → 系统加密: 使用符合 FIPS 140-1 的算法…
六、经验教训
- 先定性再动手。 本次改了七八项 RDP 配置全部无效,真正有效的只有一项;开启抓包后在几分钟内就锁定了方向。
- 配置写了什么 ≠ 实际生效什么。 系统级 FIPS > 组策略 > 注册表,必须用抓包或行为反推真实生效值。
- 抓包第一个看"谁发的 RST"。 一条字段即可定性责任方。
- 不要忽略操作系统级开关。 应用层策略被更底层的全局安全策略覆盖时,现象会极具迷惑性。