-—————————————
原文信息:为 Windows RDP 配置 TLS, Windows Remote Desktop Enable TLS
原文来源:https://www.alongw.cn/archives/1406
原文作者:阿龙
-—————————————

之前写了一篇关于如何配置 Windows RDP 加密证书的教程(https://www.alongw.cn/archives/926),但是显然这篇教程的内容有一些的过时以及差劲

看了网上很多教程,一直没什么好的,都是大概随便讲讲,也不讲细,中间也会有一些小问题,基本上都是看着别人教程操作一遍,自己就照着写一个了,都大同小异,故作此文

这或许是互联网上最详细的中文教程

我们为什么要配置 TLS 证书

首先,我们需要知道,传输层安全性协议 (Transport Layer Security) 前身称为安全套接层(就是我们常说的 SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。 网景公司在1994年推出首版网页浏览器-网景导航者时,推出 HTTPS 协议,以 SSL 进行加密,这是 SSL 的起源。 IETF 将 SSL 进行标准化,1999 年公布 TLS 1.0 标准文件。维基百科

说人话,TLS(Transport Layer Security)是一种加密通信协议,用于提高远程桌面连接的安全性。通过加密连接,TLS 确保在数据传输过程中敏感信息得到充分保护,同时防止中间人攻击,这样就可以确保连接的完整性和真实性

因此,这些安全性措施对于确保远程桌面连接的安全至关重要,毕竟你也不希望自己在观看高级内部机密文件的时候,遭遇意想不到的事情

Windows 会自带一个自签证书,这个证书是不被认可的(就相当于没有),下图提示就是证书无效时的明显表现之一

20231229204151image788

申请 TLS 证书

使用 acme.sh 申请 SSL 证书 这篇文章中,已经详细的介绍了 acme.sh 工具的使用,使用他可以方便的生成和自动续订 TLS 证书,本文就不过多赘述

当然,也可以使用各大国内平台的免费证书小白式申请(比如:腾讯云阿里云

转换 TLS 证书

如果申请证书的渠道提供下载 pfx 格式证书功能的话,就不需要此操作

由于 Windows 需要 pkcs12 (即 pfx)格式的证书,因此可以使用 acme.sh 自带的转换功能进行转换

1
acme.sh  --toPkcs  -d <domain>  [--password pfx-password]

不传入密码则会在后续通过对话的形式询问

如果没有 acme.sh 也可以使用 openssl 或者在线网站来进行转换

1
openssl pkcs12 -export -in <cer file> -inkey <key file> -out <out file>

同样,会使用对话的形式询问证书的密码

Q:为什么要设置密码?而其他格式又不需要?
A: 因为 pkcs12 格式的证书不仅包含公钥,且包含私钥,因此为了确保安全,需且必须要设置密码

打开微软控制台

进入需要安装证书的目标机器,打开微软控制台(即运行 mmc 命令),或者直接打开证书管理器一步到位

下面步骤二选一既可(也可以直接双击打开资源管理器上的证书文件,快速打开导入向导

直接打开证书管理器微软控制台程序程序

使用运行或开始菜单搜索 certlm.msc ,打开相关程序

20231230115356image776

20231230115442image763

使用微软控制台程序

20231229203115image475

进入控制台,按照实际情况配置控制台,如果仅是为了实现本文目的,则可按照下文操作。如果配置了远程控制台或其他形式的控制台,则可使用已经配置好的控制台操作。

点击菜单栏中的 “文件” — “添加/删除管理单元”

20231229203236image738-1024x596

在弹出的穿梭框中,将 “证书” 管理单元从 “可用的管理单元” 添加到 “所选管理单元”

20231229203627image347-1024x600

按照实际情况配置控制台,本文将配置 该管理单元始终为下列账户管理证书计算机账户

20231229203734image297

按照实际情况配置管理访问,本文将配置 这个管理单元将始终管理 配置为 本地计算机

20231229204026image687

完成后确认添加

20231229204053image110

导入 TLS 证书

添加完成后,依次展开 “证书” — “个人” ,随后右键 个人 或右侧空白位置,在打开的上下文菜单(即右键菜单)中依次选择 “所有任务” — “导入”

20231229204451image533-1024x599

在弹出的证书导入向导中,选择 浏览

20231229204818image402-1024x599

在选择文件的窗口中,将右下角的文件类型切换为 个人信息交换 ,然后选择打开需要导入的证书文件

20231229204918image929

打开后,在证书导入向导中键入导出时设置的密码,随后点击下一步

20231229205237image104-1024x598

在证书导入向导中,将证书的存储位置设置为个人,如图所示

20231229205501image356

完成导入

20231229205529image962-1024x596

顺带说一下,如果使用的是自签名证书,则在 RDP 的服务端和客户端都按照同样步骤安装证书既可

配置 TLS 证书的权限

这一步不是必须的,通常会自动设置,当然你可以检查一下

右键刚刚导入的证书,在弹出的上下文菜单中依次选择 “所有任务” — “管理私钥”

20231229211430image234

检查用户 “NETWORK SERRVICE” 是否有读取权限

20231229211658image155

如果没有,则手动配置一下,具体操作如下,这里就简要概括一下

20231229211720image867

20231229211842image361

取 TLS 证书的指纹

查看证书的信息,在 “详细信息” 选项卡中选择指纹既可查看,如下图箭头的位置

20231229210146image551-1024x607

应用 TLS 证书

应用证书的方法有很多,这边列举三种方法,任选一种方法既可

方法一:使用 WMIC 命令

(不能用的先往下看)

WMIC 是 Windows 管理规范的拓展

用管理员身份运行命令提示符(CMD)或 PowerShell

右键 Windows 微标键,选择 Windows PowerShell (管理员)

20231229210516image638

执行以下命令既可

1
wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="前面获取的 TLS 证书指纹"

方法二:使用 PowerShell

“WMIC 已在 Windows 10 版本 21H1 和 Windows Server General Availability Channel 的 21H1 版本中弃用。该工具已被用于 WMI 的 Windows PowerShell 取代

Microsoft 微软

微软曾宣布,WMIC 已开始在 Windows Server 中弃用 wmic.exe,转而支持 Windows PowerShell,其中还包括查询 Windows Management Instrumentation 的能力,因此,如果你使用不了上面的方法,则可以使用此方法

右键 Windows 微标键,选择 Windows PowerShell (管理员),注意不能用命令提示符,必须用 PowerShell

![20231229210516image638 (1)](../static/RDP配置TLS加密/20231229210516image638 (1).png)

执行下面命令

1
(Get-WmiObject -Namespace root\cimv2\TerminalServices -Class Win32_TSGeneralSetting -Filter 'TerminalName="RDP-Tcp"').SSLCertificateSHA1Hash = "前面获取的 TLS 证书指纹"

方法三:手动修改注册表

启动注册表编辑器,可以直接在开始菜单搜索,也可以运行 regedit 命令

20231229211953image433

依次打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp ,如果路径不存在,则新建

打开后新建一个名为 SSLCertificateSHA1Hash 的二进制值

20231229212037image145

在弹出的编辑二进制数值窗口中,把刚才获取到的 TLS 证书指纹填入 数值数据

20231229212213image319

配置 TLS 版本

这一步是可选的,但是为了安全,仍然建议配置

TLS 1.0 与 TLS 1.1 已经是不安全的协议,因此在任何场景我们都尽量不要使用他们

具体原因可参考
https://learn.microsoft.com/zh-cn/lifecycle/announcements/transport-layer-security-1x-disablement
https://www.trustasia.com/view-security-tls-browser/

各系统版本对 TLS 各个版本的支持情况(来自 https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl–schannel-ssp-

Windows OS TLS 1.0 Client TLS 1.0 Server TLS 1.1 Client TLS 1.1 Server TLS 1.2 Client TLS 1.2 Server TLS 1.3 Server TLS 1.3 Client
Windows Vista/Windows Server 2008 Enabled Enabled Not supported Not supported Not supported Not supported Not supported Not supported
Windows Server 2008 with Service Pack 2 (SP2) Enabled Enabled Disabled Disabled Disabled Disabled Not supported Not supported
Windows 7/Windows Server 2008 R2 Enabled Enabled Disabled Disabled Disabled Disabled Not supported Not supported
Windows 8/Windows Server 2012 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 8.1/Windows Server 2012 R2 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1507 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1511 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1607/Windows Server 2016 Standard Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1703 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1709 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1803 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1809//Windows Server 2019 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1903 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 1909 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 2004 Enabled Enabled Enabled Enabled Enabled Enabled Not supported Not supported
Windows 10, version 20H2 Enabled Enabled Enabled Enabled Enabled Enabled Not Supported Not Supported
Windows 10, version 21H1 Enabled Enabled Enabled Enabled Enabled Enabled Not Supported Not Supported
Windows 10, version 21H2 Enabled Enabled Enabled Enabled Enabled Enabled Not Supported Not Supported
Windows 10, version 22H1 Enabled Enabled Enabled Enabled Enabled Enabled Not Supported Not Supported
Windows 10, version 22H2 Enabled Enabled Enabled Enabled Enabled Enabled Not Supported Not Supported
Windows Server 2022 Enabled Enabled Enabled Enabled Enabled Enabled Enabled Enabled
Windows 11 Enabled Enabled Enabled Enabled Enabled Enabled Enabled Enabled

按照表中的信息,截至当前仅有 Windows 11 和 Windows Server 2022 支持 TLS 1.3 ,关于未来的版本请参考来源链接中的信息。如果你在连接时提示 “出现了内部错误” ,可能就是因此而造成的(我曾遇到一个问题,参见 https://learn.microsoft.com/en-us/answers/questions/1276049/when-i-use-the-remote-desktop-software-from-the-mi 可见每次微软官方都没有解决我的问题,都是在后续中自行发现的)

使用注册表编辑器打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentcontrolSet\Control\SecurityProviders\SCHANNEL\Protocols (没有则新建)

Protocols 项中,可以新建如 TLS 1.0TLS 1.1TLS 1.3 这样的项

在新建出来的 TLS X.X 项中,再次新建 Server

鼠标右键点击 Server 项,在打开的上下文菜单中依次选择 “新建” — “DWORD (32位)值”,重命名改值为 Enabled,双击 Enabled,在弹出的编辑 DWORD(32位)值窗口中,数值数据 键入 010 为禁用,1 为启用),点击确定既可

我这边将 TLS 1.3 设置为启用,TLS 1.0TLS 1.1 设置为禁用,效果如图

20231229214405image296

20231229214412image151-1024x592

当然,顺带提一下,这一项也适用于客户端,像 Server 项那样配置 Client 项既可,我这边配置客户端启用 TLS 1.3 ,如图

20231229214448image550-1024x676

尾声

在进行完所有配置之后,需要重启相关服务才能生效,不过我这边建议直接重启计算机

重启后测试连接,在全屏的浮动菜单栏中,会出现安全信息的选项(即小锁图标),且连接时不再会出现警告

20231229214934image888

提高远程连接的安全层和加密等级、配置 TLS 证书、禁用 TLS 1.0 等,这些配置的确能够提高远程桌面连接 RDP 的安全性。但实际上,RDP 的最大威胁还是漏洞以及微软那坨屎,2019 年就曾经出现了最严重的漏洞 “BlueKeep”(官方分类为 CVE-2019-0708),如果攻击者向特定端口(通常为 3389)发送经特殊设计的请求,则攻击者可以在计算机上执行所需的任何代码。(来自 https://vickey.fun/2022/08/27/Make-Remote-Desktop-Connection-More-Secure)
Cloudflare 关于 RDP 漏洞的解释:https://www.cloudflare.com/zh-cn/learning/access-management/rdp-security-risks/

参考文献

https://vickey.fun/2022/08/27/Make-Remote-Desktop-Connection-More-Secure

https://medium.com/thesecmaster/how-to-enable-tls-1-3-on-windows-server-2022-289f33211fad

https://blog.csdn.net/weixin_39568073/article/details/122068740

https://docs.oracle.com/cd/E35310_01/E40129/html/Windows-Network-Security.html

https://www.cloudflare.com/zh-cn/learning/access-management/rdp-security-risks/

https://techcommunity.microsoft.com/t5/ask-the-performance-team/listener-certificate-configurations-in-windows-server-2012-2012/ba-p/375467

https://c.m.163.com/news/a/H7Q87R280552ED9Y.html

https://www.trustasia.com/view-security-tls-browser/

https://learn.microsoft.com/en-us/answers/questions/514240/use-tls-1-3-for-rdp-(windows-server-2022)

https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl–schannel-ssp-

https://learn.microsoft.com/en-us/answers/questions/1339553/configure-tls-1-3-for-use-rdp-windows-server-2022

如何将PEM格式证书转化为PFX

pem证书转pfx证书分两种,一种带ca证书转换,一种不带ca证书转换

pem转pfx(不带ca证书)

以test.pem转test.pfx为例

1
2
3
openssl rsa -in test.pem -out test.key
openssl x509 -in test.pem -out test.crt
openssl pkcs12 -export -out test.pfx -inkey test.key -in test.crt

pem转pfx(带ca证书)

以test.pem和ca.crt(ca.pem)转 test_ca.pfx为例

rsa -in test.pem -out test.key
1
2
openssl x509 -in test.pem -out test.crt
openssl pkcs12 -export -out test_ca.pfx -inkey test.key -in test.crt -CAfile ca.crt

如果ca证书为pem格式

1
2
3
openssl pkcs12 -export -out test_ca.pfx -inkey test.key -in test.crt -CAfile ca.pem
openssl pkcs12 -export -out client-ca.pfx -inkey client-key.pem -in client-cert.pem -CAfile cacert.pem
openssl pkcs12 -export -out client.pfx -inkey client-key.pem -in client-cert.pem

ps(个人用):

1
2
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
openssl pkcs12 -export -out client-ca.pfx -inkey client.key -in client.crt -CAfile ca.crt