Windows 10/11 专业版和 Windows Server 的远程桌面(RDP)默认会使用系统自动生成的自签名证书。这个证书虽然可以加密连接,但客户端无法确认它来自受信任的证书颁发机构,所以连接时经常会看到“证书来自不信任的证书验证机构”之类的警告。

解决思路很简单:给这台 Windows 主机准备一张可信 SSL 证书,把证书导入到本地计算机证书存储区,然后把该证书绑定给 RDP 监听器使用。

适用场景

  • Windows 10/11 专业版开启远程桌面;
  • Windows Server 使用远程桌面管理;
  • 已经拥有一个可用于该主机名或域名的 SSL 证书;
  • 希望 RDP 连接时不再提示证书不受信任。

注意:证书的域名要和你连接 RDP 时使用的主机名匹配。比如你用 rdp.example.com 连接远程桌面,那么证书也应该签发给 rdp.example.com

准备证书

RDP 最方便使用的是带私钥的 PFX/P12 证书文件。

如果你从云厂商申请证书,可以优先下载 Tomcat / IIS / PFX 这类格式,因为通常会直接包含证书和私钥。

如果你手里是 PEM 证书和 KEY 私钥,可以用 OpenSSL 转成 PFX:

1
2
3
4
5
openssl pkcs12 -export \
-clcerts \
-in fullchain.pem \
-inkey private.key \
-out rdp-cert.pfx

执行时会要求设置一个导出密码。后面导入证书时会用到这个密码。

导入到本地计算机证书存储

在 Windows 上执行以下步骤:

  1. Win + R 打开“运行”;
  2. 输入 mmc,打开“管理控制台”;
  3. 点击顶部菜单:文件 → 添加/删除管理单元
  4. 在左侧选择 证书,点击 添加
  5. 选择 计算机账户,点击 下一步
  6. 选择 本地计算机,点击 完成
  7. 回到管理单元列表后点击 确定

然后在左侧展开:

1
证书(本地计算机) → 个人 → 证书

右键 证书,选择:

1
所有任务 → 导入

按照向导选择前面准备好的 .pfx / .p12 文件,输入导出密码,并把证书导入到本地计算机的个人证书存储区。

导入完成后,应该可以在“个人 → 证书”里看到这张证书。

给 RDP 服务授予私钥读取权限

RDP 服务需要能读取证书私钥,否则即使证书导入成功,也可能无法正常绑定或使用。

在证书管理器中:

  1. 找到刚导入的证书;
  2. 右键证书,选择 所有任务 → 管理私钥
  3. 添加用户:NETWORK SERVICE
  4. NETWORK SERVICE 至少授予 读取 权限;
  5. 保存退出。

如果系统是中文界面,用户选择框里可以直接输入:

1
NETWORK SERVICE

然后点“检查名称”。系统识别后再确认。

获取证书指纹

双击证书,进入证书详情:

1
详细信息 → 指纹

复制指纹内容。

复制出来的指纹通常带空格,建议先去掉空格,最终得到一串连续的 SHA1 指纹,例如:

1
‎ABCD1234ABCD1234ABCD1234ABCD1234ABCD1234

如果复制后开头有隐藏字符,也要删掉。最稳妥的做法是粘贴到纯文本编辑器里检查一遍,只保留十六进制字符。

绑定证书到 RDP 监听器

以管理员身份打开 PowerShell,执行:

1
2
3
$thumbprint = "替换为你的证书指纹"
$path = "Win32_TSGeneralSetting.TerminalName='RDP-tcp'"
Set-WmiInstance -Namespace "root\cimv2\TerminalServices" -Path $path -Arguments @{SSLCertificateSHA1Hash=$thumbprint}

也可以使用传统 wmic 命令:

1
wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="替换为你的证书指纹"

新版 Windows 里 wmic 已经逐步被弃用,如果可用,优先使用 PowerShell 的 Set-WmiInstance

重启远程桌面服务

绑定完成后,建议重启 Remote Desktop Services,让配置立即生效。

可以在管理员 PowerShell 中执行:

1
Restart-Service TermService -Force

注意:如果你当前就是通过 RDP 连进去的,重启该服务会短暂断开远程桌面连接。更稳妥的方式是在本机控制台或有备用连接方式时操作。

验证配置

重新用域名连接 RDP:

1
rdp.example.com

如果证书链完整、域名匹配、客户端信任该 CA,连接时就不应该再出现“不受信任的证书验证机构”警告。

也可以在 Windows 上查询当前 RDP 证书指纹:

1
2
3
4
Get-WmiObject -Namespace "root\cimv2\TerminalServices" `
-Class Win32_TSGeneralSetting `
-Filter "TerminalName='RDP-tcp'" |
Select-Object SSLCertificateSHA1Hash

输出的 SSLCertificateSHA1Hash 应该和刚才绑定的证书指纹一致。

常见问题

证书导入了,但绑定后仍然报错

重点检查三件事:

  1. 证书是否包含私钥;
  2. NETWORK SERVICE 是否有私钥读取权限;
  3. 指纹是否复制正确,尤其是空格和隐藏字符。

证书可信,但仍提示名称不匹配

这通常是连接 RDP 时使用的地址和证书域名不一致。

例如证书签发给:

1
rdp.example.com

但你连接时用了:

1
192.168.1.10

客户端就可能提示名称不匹配。解决办法是使用证书对应的域名连接,或者给证书添加正确的 SAN。

Let’s Encrypt 证书能不能用?

可以。只要证书链完整,并且能导出为带私钥的 PFX/P12 文件,就可以用于 RDP。

如果使用 Let’s Encrypt,需要注意证书有效期通常是 90 天,续期后还要同步更新 RDP 绑定。生产环境建议写自动化脚本处理续期、导入和绑定。

小结

RDP 证书配置的核心步骤是:

  1. 准备带私钥的 PFX/P12 证书;
  2. 导入到“本地计算机 → 个人 → 证书”;
  3. NETWORK SERVICE 授予私钥读取权限;
  4. 获取证书 SHA1 指纹;
  5. 通过 WMI 把指纹写入 RDP 监听器;
  6. 重启远程桌面服务并验证。

配置完成后,RDP 连接体验会干净很多,也更适合长期暴露给固定管理入口使用。

参考资料