通过RDP协议客户端远程连接Windows实例时出现身份验证错误如何解决?

本文介绍通过微软的RDP协议客户端远程连接Windows实例时出现身份验证错误提示的解决方案。

问题现象

通过微软的RDP协议客户端远程连接Windows实例时,出现错误提示“出现身份验证错误,要求的函数不受支持(The function requested is not supported)”。

问题原因

微软官方于2018年5月,更新了凭据安全支持提供程序协议(CredSSP)相关补丁和身份验证请求方式。当遇到如下一种情景时,会出现该连接错误:

  • 情景一:客户端未更新该补丁,服务器端已更新该补丁且加密Oracle修正的策略为强制更新的客户端。

  • 情景二:客户端已更新该补丁且加密Oracle修正的策略为强制更新,服务器端未更新该补丁。

  • 情景三:客户端已更新该补丁且加密Oracle修正的策略为缓解,服务器端未更新该补丁。

说明
  • 未更新该补丁,指没有更新自2018年5月起至今的任意版本补丁,包括最新版本补丁。

  • 已更新该补丁,指更新过自2018年5月起至今的任意版本补丁或者所有版本补丁,包括最新版本补丁。

  • 更多加密Oracle修正的策略信息,请参见CVE-2018-0886的CredSSP更新

解决方案

方法一:服务器端允许任意版本的远程桌面连接

由于Windows Server系统版本较多,且各版本之间操作略有差异,此处分别以Windows Server 2008 R2、Windows Server 2012 R2和Windows Server 2016版本为例,步骤如下。

Windows Server 2008 R2系统版本

  1. 通过管理终端连接Windows实例。

    具体操作,请参见连接方式概述

  2. 单击开始,右键单击计算机,然后单击属性win2008开始菜单

  3. 控制面板主页上,单击远程设置win2008远程设置

  4. 系统属性对话框中,勾选允许运行任意版本远程桌面的计算机连接(较不安全) ,然后单击确定win2008允许

Windows Server 2012 R2系统版本

  1. 通过管理终端连接Windows实例。

    具体操作,请参见连接方式概述

  2. 单击win2012开始图标图标,右键单击这台电脑,然后单击属性win2012开始

  3. 控制面板主页上,单击远程设置win2012远程设置

  4. 远程页签下,取消勾选仅允许运行使用网络级别身份验证的远程桌面的计算机连接(建议) ,然后单击确定win2012取消勾选

Windows Server 2016系统版本

  1. 通过管理终端连接Windows实例。

    具体操作,请参见连接方式概述

  2. 单击Dingtalk_20210510142550.jpg图标,然后单击Windows系统

  3. 右键单击此电脑,然后选择更多 > 属性win2016属性

  4. 控制面板主页上,单击远程设置win2016远程设置

  5. 远程页签下,取消勾选仅允许运行使用网络级别身份验证的远程桌面的计算机连接(建议) ,然后单击确定win2016取消勾选

方法二 :Windows安全更新

此处以Windows Server 2016系统版本为例,其他Windows系统版本操作类似。

  1. 通过管理终端连接Windows实例。

    具体操作,请参见连接方式概述

  2. 单击Dingtalk_20210510142550.jpg图标,单击设置win2016开始

  3. Windows 设置页面,单击更新安全win2016更新与安全

  4. 更新状态页面,单击检查更新,等待更新下载和安装。

    说明

    如果需要手动安装CredSSP对应安全更新包,请访问微软官网,然后下载对应版本的安全更新包。

    win2016检查更新
  5. 重启Windows实例或重启服务器以完成安装更新。

    • 方式一:在ECS控制台上重启Windows实例,具体操作,请参见重启实例

    • 方式二:在远程连接的Windows实例上,选择Dingtalk_20210510142550.jpg > 电源管理 > 重启win2016重启服务器

方法三:修改注册表

此处以Windows Server 2016系统版本为例,其他Windows系统版本操作类似。当客户端或服务器端完成CredSSP相关补丁的更新后,请选择以下一种方式修改注册表。

警告

如果修改注册表不当,Windows操作系统可能会出现严重问题,您需要自行承担修改注册表的风险。修改注册表之前,建议您先创建快照备份数据,以免数据丢失。创建快照的具体操作,请参见创建一个云盘快照

(推荐)使用脚本修改注册表

  1. 通过管理终端连接Windows实例。

    具体操作,请参见连接方式概述

  2. 打开CMD命令提示行。

    1. 右键单击Dingtalk_20210510142550.jpg图标,然后单击运行win2016运行

    2. 运行对话框中输入cmdwin2016

    3. 单击确定

      进入CMD命令提示行。win2016cmd命令提示行

  3. 执行以下命令,进入PowerShell模式。

    powershell

  4. 执行如下命令,以管理员身份运行Windows PowerShell脚本。

    New-Item -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System -Name CredSSP -Force
    New-Item -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP -Name Parameters -Force
    Get-Item -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters | New-ItemProperty -Name AllowEncryptionOracle -Value 2 -PropertyType DWORD -Force

  5. 重启Windows实例或重启管理终端所在的本地计算机。

    • 方式一:在ECS控制台上重启Windows实例,具体操作,请参见重启实例

    • 方式二:重启管理终端所在的本地计算机,以本地计算机操作系统为Windows Server 2016版本为例,选择Dingtalk_20210510142550.jpg > 电源管理 > 重启,重启本地计算机。win2016重启服务器

    说明

    若您先使用本方法修改了注册表,随后又更新了客户端和Windows实例的安全补丁,建议您将 AllowEncryptionOracle数值数据设为0或者1以获得更高的安全性。AllowEncryptionOracle数值数据信息,请参见CVE-2018-0886的CredSSP更新

手动修改注册表

  1. 通过管理终端连接Windows实例。

    具体操作,请参见连接方式概述

  2. 打开注册表编辑器。

    1. 右键单击Dingtalk_20210510142550.jpg图标,然后单击运行win2016运行

    2. 运行对话框中输入regeditwin2016运行窗口

    3. 单击确定

      进入注册表编辑器。 win2016注册表编辑器

  3. 注册表编辑器页面的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters路径下,将注册表项AllowEncryptionOracle数值数据设置为2

    说明

    注册表项AllowEncryptionOracle数值数据信息,请参见CVE-2018-0886的CredSSP更新

    如果CredSSP项或Parameters项不存在,请新建对应注册表项,然后在该注册表项下新建REG_DWORD类型的注册表项AllowEncryptionOracle。以CredSSP项和Parameters均不存在为例,操作如下:

    1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System路径下新建CredSSP项。

      1. 右键单击注册表项空表区域,然后选择新建(N) > 项(K)win2016新建项

      2. 输入CredSSP,按Enter键。

        新建项
    2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP路径下新建Parameters项。Parameters项

    3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters路径下新建AllowEncryptionOracle项。新建字符串

    4. 修改注册表项AllowEncryptionOracle数值数据

      1. 右键单击注册表项AllowEncryptionOracle,然后单击修改(M)修改注册表项

      2. 在对话框中,将数值数据设置为2,然后单击确定修改数据数值

  4. 重启Windows实例或重启服务器以更新配置。

    • 方式一:在ECS控制台上重启Windows实例,具体操作,请参见重启实例

    • 方式二:在远程连接的Windows实例上,选择Dingtalk_20210510142550.jpg > 电源管理 > 重启win2016重启服务器

相关文档

CVE-2018-0886 | CredSSP 远程执行代码漏洞

阿里云首页 云服务器 ECS 相关技术圈