简介:这份PDF资料聚焦Windows 10远程桌面连接中常见的CredSSP加密Oracle修正报错,面向运维人员、系统管理员及遇到RDP连接失败的普通用户。内容围绕微软2018年修复CVE-2018-0886漏洞后引发的“身份验证错误,远程计算机要求的函数不受支持”问题展开,梳理了问题成因与两种可行解决路径:本地组策略编辑器中调整“加密Oracle修正”为易受攻击,以及针对Win10家庭版通过注册表新建AllowEncryptionOracle并设值为2。资源包为1个PDF文件,约432KB,篇幅精炼,便于随查随用。目前已有1140人学习下载。读者可借此快速定位报错根源,掌握组策略与注册表两种排错思路,并理解生产环境中及时更新补丁、统一CredSSP版本的安全意义。
1. 一次远程桌面翻车:为什么 Win10 连不上 Server 2016
那天下午,同事在群里甩了一张截图,报错信息是「出现身份验证错误,远程计算机要求的函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正」。他刚把 Win10 升到 10.0.17134,补丁也打到了最新,结果原本天天用的远程桌面直接连不上那台 Windows Server 2016 了。这不是个例,2018 年 5 月那波补丁之后,大量 Win10 客户端连旧版服务器都撞上了同一堵墙。问题根源在 CredSSP 协议——微软为了修 CVE-2018-0886 这个中间人漏洞,在 3 月的补丁里改了默认行为,5 月又把客户端策略收紧了一档,于是 mstsc 一登录就弹这个错。这篇笔记就是记录我怎么把这台 Win10 的远程连接救回来,顺带把组策略和注册表两条路都走一遍,适合正在被这个报错卡住、又不想重装系统的开发者。
2. 先搞清楚 CredSSP 加密 Oracle 修正到底改了什么
2.1 CredSSP 在远程桌面里扮演什么角色
远程桌面连接不是连上就完事,中间要经过一轮凭据传递。CredSSP(凭据安全支持提供程序协议)就是干这个的:它让客户端把用户凭据安全地交给服务器,服务器再拿去做二次认证。你可以把它理解成远程桌面登录时的一条加密通道,通道两头必须对「加密 Oracle」的修正级别达成一致,否则握手直接失败。
2018 年 3 月 13 日,微软发布补丁修复了 CVE-2018-0886,这个漏洞允许攻击者在中间人位置解密 CredSSP 传输的敏感信息。但微软当时没有强制所有机器立刻启用新协议,因为一旦强制,老服务器和新客户端之间就会互相不认。到了 2018 年 5 月 8 日,客户端策略被提严,mstsc 登录时开始主动检查对端的修正级别,不匹配就报「要求的函数不正确」。这就是为什么你升级完 Win10 反而连不上了——不是网络问题,是加密 Oracle 修正的级别没对齐。
2.2 加密 Oracle 修正的五个级别
在动手改之前,得先知道这个「修正级别」到底有哪几档。组策略里叫「加密 Oracle 修正」,注册表里对应 AllowEncryptionOracle 这个 DWORD 值,它们是一一对应的:
| 策略状态 | 注册表十进制值 | 行为 |
|---|---|---|
| 未配置 | 无此键值 | 由系统默认策略决定,通常为「已缓解」 |
| 强制更新 | 0 | 客户端强制使用修复后的 CredSSP,拒绝连接旧服务器 |
| 已缓解 | 1 | 客户端使用修复后的 CredSSP,但允许降级到旧版本 |
| 易受攻击 | 2 | 客户端使用旧版 CredSSP,兼容未修补的服务器 |
报错「要求的函数不受支持」通常出现在客户端处于「强制更新」或「已缓解」而服务器还在旧协议的时候。把客户端改成「易受攻击」就能连上,代价是这条连接不再受 CVE-2018-0886 的修复保护。测试环境里这么干没问题,生产环境得权衡。
提示:改之前先确认服务器端有没有打补丁。如果服务器也打了 2018 年 5 月之后的补丁,优先考虑升级服务器而不是降级客户端。
3. 方法一:用本地组策略把加密 Oracle 修正改成易受攻击
3.1 打开 gpedit.msc 并定位到凭据分配
先按 Win+R,输入 gpedit.msc 回车。如果你用的是 Win10 专业版、企业版或教育版,这一步能直接打开本地组策略编辑器。家庭版会提示找不到文件,那就跳到第 4 章的注册表方法。
打开后按这个路径点进去:
计算机配置 └ 管理模板 └ 系统 └ 凭据分配 └ 加密 Oracle 修正「凭据分配」在「系统」下面,不是「Windows 组件」里,别点错。找到「加密 Oracle 修正」后双击,默认状态是「未配置」。
3.2 启用策略并选择易受攻击
在弹窗里选「已启用」,然后下面的「保护级别」下拉框里选「易受攻击」。三个选项的含义是:
- 强制更新:最严格,只允许修复后的 CredSSP
- 已缓解:允许降级,但优先用修复后的版本
- 易受攻击:直接用旧版 CredSSP,兼容老服务器
选「易受攻击」后点确定。这一步改的是本地计算机策略,立即生效,不需要重启。但如果你之前已经用 mstsc 试过连接,建议把 mstsc 窗口全关掉再重新打开,避免缓存了旧的协商结果。
改完之后再连一次那台 Server 2016。如果还是报同样的错,先别急着怀疑策略没生效,往下看第 5 章的排查清单。
3.3 验证策略是否写进了注册表
组策略改完后,对应的注册表位置也会被写入。打开 regedit,定位到:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters正常情况下你会看到一个名为 AllowEncryptionOracle 的 DWORD 值,十进制是 2。如果没有,说明组策略没写进去,可能是权限问题或者策略被更高优先级的域策略覆盖了。域环境里本地组策略可能被域策略压住,这种情况得找域管理员在域级别改。
4. 方法二:家庭版没有 gpedit.msc,直接改注册表
4.1 手动创建 CredSSP 和 Parameters 项
Win10 家庭版没有组策略编辑器,只能走注册表。按 Win+R 输入 regedit 回车,定位到:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System在 System 上右键,新建一个「项」,命名为 CredSSP。然后在 CredSSP 上右键,再新建一个「项」,命名为 Parameters。注意大小写,虽然注册表不区分大小写,但保持和系统一致方便排查。
如果你在 System 下已经看到 CredSSP,那就不用新建,直接进去看有没有 Parameters。有些机器装过其他安全软件,可能已经建了 CredSSP 但里面是空的。
4.2 新建 AllowEncryptionOracle 并设值为 2
选中 Parameters,在右侧空白处右键,新建一个「DWORD(32 位)值」,命名为 AllowEncryptionOracle。然后双击它,基数选「十进制」,数值填 2。
这里有个容易翻车的点:新建的时候一定要选「DWORD(32 位)值」,不要选成「QWORD(64 位)值」或者「字符串值」。类型不对的话,系统读不到这个键,改了等于没改。填完确定,注册表里应该显示成AllowEncryptionOracle REG_DWORD 0x00000002 (2)。
4.3 重启本地电脑让注册表生效
注册表改完后,部分机器需要重启才能让 mstsc 重新读取策略。我遇到过改完不重启、mstsc 仍然报错的情况,重启后就好了。如果你不想重启,可以先试试注销当前用户再登录,但重启是最稳的。
重启后再连那台服务器。如果连上了,说明问题就是加密 Oracle 修正级别不匹配。如果还报错,检查一下是不是连错了机器,或者服务器端也有自己的策略在拦。
注意:注册表改的是 HKLM 下的策略路径,不是 HKCU。改错位置不会生效,而且可能影响其他凭据分配行为。
5. 避坑与排查:改完还连不上怎么办
5.1 现象:组策略改了但注册表没变化
原因:域环境下本地组策略被域策略覆盖,或者当前用户没有写 HKLM 的权限。解决:先确认是不是域机器,如果是,找域管理员在域策略里改「加密 Oracle 修正」。如果是本地权限问题,用管理员身份运行 gpedit.msc 再改一次。
5.2 现象:注册表建了 AllowEncryptionOracle 但值类型不对
原因:新建时选成了 QWORD 或字符串。解决:删掉重建,确保类型是 REG_DWORD。建完后在注册表编辑器里看类型列,显示 REG_DWORD 才对。值填 2,基数选十进制。
5.3 现象:改完能连了,过几天又报同样的错
原因:系统更新或安全软件把策略重置了。解决:检查 Windows Update 有没有装新的累积更新,某些更新会重新应用默认的 CredSSP 策略。另外,部分终端安全软件会监控并恢复注册表策略项,需要把这条策略加进白名单。
5.4 现象:服务器端也报了类似的错
原因:服务器端 CredSSP 策略同样被收紧。解决:在服务器上重复第 3 章或第 4 章的操作,把服务器端的加密 Oracle 修正也改成「易受攻击」。但生产服务器不建议长期这么设,优先给服务器打全补丁,让两端都支持修复后的 CredSSP。
5.5 现象:mstsc 连其他机器正常,只连这一台报错
原因:这台服务器的 CredSSP 版本和客户端不匹配,或者服务器端组策略强制了「强制更新」。解决:登到服务器上检查它的本地组策略,路径同样是「计算机配置 > 管理模板 > 系统 > 凭据分配 > 加密 Oracle 修正」。如果服务器是「强制更新」,客户端改成「易受攻击」也连不上,必须两边对齐。
6. 装完怎么验证:三条命令确认远程连接真的通了
改完策略或注册表,别只靠 mstsc 弹不弹错来判断。我一般会走这三步验证,确保不是玄学连上。
第一步,确认注册表值写对了。以管理员身份打开 PowerShell,跑:
# 读取 CredSSP 策略下的 AllowEncryptionOracle 值 Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters" -Name "AllowEncryptionOracle"正常输出里AllowEncryptionOracle应该是 2。如果报「找不到路径」,说明 CredSSP 或 Parameters 项没建对,回第 4 章重来。
第二步,用 mstsc 带参数发起一次连接,观察是否还弹 CredSSP 错误:
# 在 cmd 里直接调 mstsc,指定目标服务器地址 mstsc /v:192.168.1.100把 IP 换成你实际要连的服务器。如果弹出凭据窗口而不是报错弹窗,说明 CredSSP 协商已经过了。输入账号密码能进桌面,就是彻底通了。
第三步,如果条件允许,在服务器端查一下 CredSSP 相关的事件日志。打开事件查看器,定位到:
应用程序和服务日志 > Microsoft > Windows > TerminalServices-RemoteConnectionManager看 Operational 日志里有没有 CredSSP 相关的错误事件。如果客户端连上了但服务器端还在记协商失败,说明连接是降级成功的,但服务器端策略仍然偏严,长期看还是得把服务器补丁打齐。
这三步走完,基本能确定是策略层面通了,而不是网络或防火墙的偶然放行。从那以后我每次动 CredSSP 策略,都会先用 PowerShell 读一遍注册表值,再用 mstsc 实连一次,最后翻一眼服务器日志,三样都对上才敢说「修好了」。希望帮到你。
本文还有配套的精品资源,点击获取