远程桌面「由于数据加密错误」排障经验

归档: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 由客户端发出查客户端加密能力、系统更新、凭据缓存

五、关键配置速查

项目注册表路径取值
系统级 FIPSHKLM\SYSTEM\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled0=关 / 1=开(本次元凶)
会话安全层...\Control\Terminal Server\WinStations\RDP-Tcp\SecurityLayer0=RDP / 1=协商 / 2=SSL
加密级别同路径 MinEncryptionLevel1=低 / 2=兼容 / 3=高级 / 4=FIPS
NLA同路径 UserAuthentication0=禁用 / 1=启用
证书绑定同路径 SSLCertificateSHA1Hash证书指纹二进制

⚠️ MinEncryptionLevel = 2(客户端兼容)有陷阱:服务器会挑选客户端自称支持的最强加密,而新版客户端支持 FIPS,容易意外落到 3DES。要强制 128 位应选 3(高级)。

组策略路径

远程桌面会话主机 → 安全 → 远程(RDP)连接要求使用指定的安全层
远程桌面会话主机 → 安全 → 设置客户端连接加密级别
远程桌面会话主机 → 连接 → 选择 RDP 传输协议
secpol.msc → 安全选项 → 系统加密: 使用符合 FIPS 140-1 的算法…

六、经验教训

  1. 先定性再动手。 本次改了七八项 RDP 配置全部无效,真正有效的只有一项;开启抓包后在几分钟内就锁定了方向。
  2. 配置写了什么 ≠ 实际生效什么。 系统级 FIPS > 组策略 > 注册表,必须用抓包或行为反推真实生效值。
  3. 抓包第一个看"谁发的 RST"。 一条字段即可定性责任方。
  4. 不要忽略操作系统级开关。 应用层策略被更底层的全局安全策略覆盖时,现象会极具迷惑性。