RDP配置TLS加密
-—————————————
原文信息:为 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 会自带一个自签证书,这个证书是不被认可的(就相当于没有),下图提示就是证书无效时的明显表现之一
申请 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
,打开相关程序
使用微软控制台程序
进入控制台,按照实际情况配置控制台,如果仅是为了实现本文目的,则可按照下文操作。如果配置了远程控制台或其他形式的控制台,则可使用已经配置好的控制台操作。
点击菜单栏中的 “文件” — “添加/删除管理单元”
在弹出的穿梭框中,将 “证书” 管理单元从 “可用的管理单元” 添加到 “所选管理单元”
按照实际情况配置控制台,本文将配置 该管理单元始终为下列账户管理证书
为 计算机账户
按照实际情况配置管理访问,本文将配置 这个管理单元将始终管理
配置为 本地计算机
完成后确认添加
导入 TLS 证书
添加完成后,依次展开 “证书” — “个人” ,随后右键 个人
或右侧空白位置,在打开的上下文菜单(即右键菜单)中依次选择 “所有任务” — “导入”
在弹出的证书导入向导中,选择 浏览
在选择文件的窗口中,将右下角的文件类型切换为 个人信息交换
,然后选择打开需要导入的证书文件
打开后,在证书导入向导中键入导出时设置的密码,随后点击下一步
在证书导入向导中,将证书的存储位置设置为个人,如图所示
完成导入
顺带说一下,如果使用的是自签名证书,则在 RDP 的服务端和客户端都按照同样步骤安装证书既可
配置 TLS 证书的权限
这一步不是必须的,通常会自动设置,当然你可以检查一下
右键刚刚导入的证书,在弹出的上下文菜单中依次选择 “所有任务” — “管理私钥”
检查用户 “NETWORK SERRVICE” 是否有读取权限
如果没有,则手动配置一下,具体操作如下,这里就简要概括一下
取 TLS 证书的指纹
查看证书的信息,在 “详细信息” 选项卡中选择指纹既可查看,如下图箭头的位置
应用 TLS 证书
应用证书的方法有很多,这边列举三种方法,任选一种方法既可
方法一:使用 WMIC 命令
(不能用的先往下看)
WMIC 是 Windows 管理规范的拓展
用管理员身份运行命令提示符(CMD)或 PowerShell
右键 Windows 微标键,选择 Windows PowerShell (管理员)
执行以下命令既可
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
命令
依次打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
,如果路径不存在,则新建
打开后新建一个名为 SSLCertificateSHA1Hash
的二进制值
在弹出的编辑二进制数值窗口中,把刚才获取到的 TLS 证书指纹填入 数值数据
配置 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.0
、 TLS 1.1
、TLS 1.3
这样的项
在新建出来的 TLS X.X
项中,再次新建 Server
项
鼠标右键点击 Server
项,在打开的上下文菜单中依次选择 “新建” — “DWORD (32位)值”,重命名改值为 Enabled
,双击 Enabled
,在弹出的编辑 DWORD(32位)值窗口中,数值数据 键入 0
或 1
(0
为禁用,1
为启用),点击确定既可
我这边将 TLS 1.3
设置为启用,TLS 1.0
、 TLS 1.1
设置为禁用,效果如图
当然,顺带提一下,这一项也适用于客户端,像 Server
项那样配置 Client
项既可,我这边配置客户端启用 TLS 1.3
,如图
尾声
在进行完所有配置之后,需要重启相关服务才能生效,不过我这边建议直接重启计算机
重启后测试连接,在全屏的浮动菜单栏中,会出现安全信息的选项(即小锁图标),且连接时不再会出现警告
提高远程连接的安全层和加密等级、配置 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://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-
如何将PEM格式证书转化为PFX
pem证书转pfx证书分两种,一种带ca证书转换,一种不带ca证书转换
pem转pfx(不带ca证书)
以test.pem转test.pfx为例
1 | openssl rsa -in test.pem -out test.key |
pem转pfx(带ca证书)
以test.pem和ca.crt(ca.pem)转 test_ca.pfx为例
1 | openssl x509 -in test.pem -out test.crt |
如果ca证书为pem格式
1 | openssl pkcs12 -export -out test_ca.pfx -inkey test.key -in test.crt -CAfile ca.pem |
ps(个人用):
1 | openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt |