Windows Remote Desktop(俗称RDP)是一个Windows自带的远程桌面软件,允许用户通过网络从一个地点远程访问和控制另一台电脑,支持SSL加密连接,跨平台和无感操作等优点。
跨平台和操作就不说了,就直说这个SSL加密连接,居然是默认启用SSL加密,但是使用的证书是Windows系统自己生成的一个自签名证书,也不知道微软怎么想的。本篇文章就来深入Windows系统注册表修改远程桌面SSL证书
这应该是全互联网最简单的方法了(应该吧)
在我们对一台Windows电脑进行远程连接的时候,一般都会弹个窗,告诉我们"无法验证此远程计算机的身份",也就是访问地址和证书对不上

因为Windows在安装的时候,会在系统内部生成一个以计算机名为域名的证书,非常鸡肋
不过你要是点击不再询问后也没啥,但是治标不治本,你换一台电脑连接还是会报错,所以我们就得想办法更换系统中RDP所使用的SSL证书
(连接安全到没啥,主要是看得舒服)
SSL证书一般很好申请,网站用的和RDP用的其实都一样,在腾讯云和阿里云之类的大厂都可以申请到1年的免费SSL证书。以下是可以免费申请SSL证书的地址
这些SSL证书 不推荐 付费,那种企业级顶级加密证书也不是我们这种凡人能用的(如果你是富哥当我没说)
(这一步如果是阿里云和腾讯云申请的证书可以跳过,因为这两家官方提供PFX证书下载)
Windows所使用的证书和我们平常用的xxxxx.key和xxxxx.crt不同,Windows所使用的证书是 PKCS#12 证书标准,证书通常为xxxxx.pfx ,由于大部分证书签发下来后都是key和pem格式,所以我们要转换为pfx才能给Windows使用
注意!老旧系统不支持最新的SSL加密协议,比如Windows Server 2012R2,在给老旧系统转换证书时要注意OpenSSL版本
这里我们下载 OpenSSL 进行转换,下载Win64 Light版就可以了,OpenSSL3.X版本不支持Windows Server 2012R2等老旧系统,如果要给老旧系统使用,请下载OpenSSL1.X版本! 下载好后随机安装到一个目录下,要记住安装路径
我们打开OpenSSL安装路径的/bin目录,把我们申请到的证书放进去后把pem文件和key文件改名为myssl.pem和myssl.key
放进去后我们打开cmd后cd到此目录,输入以下命令回车
它会让你输入两边私钥密码,要记住这个密码,添加证书时要用
完成后我们在此目录里找到myssl.pfx这个文件,这就是我们转换后的文件,保存备用
这一步就是把我们已经下载或转换好的xxxxx.pfx证书导入进系统里
我看了各大教程,都是很复杂的到mmc控制台添加管理单元再添加证书管理单元之类的
我自己摸索出个非常非常简单的方法,简单实用不劝退
这时我们打开Win+R输入certlm.msc找到 个人→证书 就能看到我们添加的证书了
选定刚添加的证书右键 所有任务→管理私钥 在 用户→添加→高级→立即查找 在搜索结果里找到NETWORK SERVICE双击添加确定即可
在用户里找到我们刚才添加的NETWORK SERVICE选定后权限设置为可读取,设置好后点确定退出即可
然后我们双击证书,在详细信息里找到指纹,复制值备用
这时我们证书就算添加好了
这里有三个办法,亲测每个都可用
这三种方法都不用重启,保存即生效
打开PowerShell(管理员)输入:
示例:
打开PowerShell(管理员)输入:
示例:
打开注册表,打开以下路径
在此路径下新建一个SSLCertificateSHA1Hash的二进制值后双击在数值数据内填入SSL证书指纹,确定即可
到这我们基本上就配置好了,连接后也不会有不安全弹窗了,连接也会更安全(舒服多了)

参考资料:阿龙的笔记 (刚发没三小时我就顺过来了XD)
openssl pkcs12 -export -in myssl.pem -inkey myssl.key -out myssl.pfx
$thumbprint = "{SSL证书指纹}"
$path = (Get-WmiObject -Namespace root\cimv2\TerminalServices -Class Win32_TSGeneralSetting -Filter 'TerminalName="RDP-Tcp"').__path
Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash="$thumbprint"}
$thumbprint = "f341456258ea10bd2e2f97542a1ce537b357159b3"
$path = (Get-WmiObject -Namespace root\cimv2\TerminalServices -Class Win32_TSGeneralSetting -Filter 'TerminalName="RDP-Tcp"').__path
Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash="$thumbprint"}
wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="{SSL证书指纹}"
wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="f341456258ea10bd2e2f97542a1ce537b357159b3"
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp