如何为 Windows 10 的远程桌面 (RDP) 连接提供经过验证的服务器证书

如何为 Windows 10 的远程桌面 (RDP) 连接提供经过验证的服务器证书

我们办公室有一台 Windows 10 Pro 机器,它有一个开放的互联网端口,用于传入的远程桌面连接(“主机”)。它受到复杂密码和有限尝试次数的良好保护,并且仅支持 TLS 1.1 或更高版本,但它没有提供外部验证的 SSL 证书,只有远程桌面服务提供的自生成自签名证书,这给我们带来了两个问题:

  1. 当远程连接时,我们不能完全确信我们确实连接到这台机器而不是某些被劫持的连接。
  2. 我们的网站未通过 PCI-DSS 3.1 合规性检查(这是必需的,因为我们在那里使用通过互联网连接的销售点借记卡/信用卡机)。检查报告此面向互联网的远程桌面端口出现致命错误:“SSL 自签名证书”和“带有错误主机名的 SSL 证书”。

如何让作为服务器/主机的 Windows 10 Pro(或 Windows 7/8/8.1 Pro)机器提供适当的 SSL 证书以进行远程桌面验证?

答案1

您可以将此主机设置为使用并提供您(现有的)外部验证的 SSL 证书,因此(说明可能也适用于 Windows 8 和 8.1,可能适用于 Windows 7,也可能不适用于 Windows 7)(部分内容基于Microsoft 知识库 2001849):

首先,您需要拥有一个经过验证的真正的 SSL 证书,无论是您购买的证书还是从 LetsEncrypt 等处获得的免费证书。

如果您拥有 pkcs12 格式文件(例如 pfx 扩展名)中的此证书,则可以使用 Linux 或 Cygwin 查看 SHA1 指纹(您将在下面需要它):

openssl pkcs12 -in mysite.pfx -nodes|openssl x509 -noout -fingerprint

或者,如果您的 Linux 服务器中的 /etc/ssl 有单独的证书文件(/etc/ssl/certs/mysite.crt、/etc/ssl/mysite.ca-bundle 和 /etc/ssl/private/mysite.key),您可以创建 pfx 文件并获取 SHA1 指纹,如下所示:

  1. 如果您还没有证书,请创建 pfx 文件(此处:mysite.pfx)– 在请求时设置一个好的密码:

    sudo openssl pkcs12  -export -out mysite.pfx -inkey /etc/ssl/private/mysite.pem -in /etc/ssl/certs/mysite.crt -certfile /etc/ssl/mysite.ca-bundle
    
  2. 根据需要移动或复制此 pfx 文件,以便 Windows 主机可以访问它。

  3. 查看密钥的 SHA1 指纹(您将在下面需要它):

openssl x509 -in /etc/ssl/certs/mysite.crt -noout -fingerprint

将 pkcs12 格式(例如 pfx)文件导入 Windows 主机的个人证书存储区:

  1. 开始>运行>mmc
  2. 文件 > 添加删除管理单元 > 证书 > 添加 > 计算机帐户 > 本地计算机 > 确定
  3. 在左侧窗口中右键单击证书(本地计算机)个人,选择所有任务/导入…
  4. 找到 pfx 文件并导入它,我建议出于安全原因不要将其设置为可导出。
  5. 展开您的个人/证书,您现在应该会看到 3 个证书,其中一个是您的站点证书(例如 example.com)。右键单击此站点证书,然后右键单击,选择所有任务/管理私钥…
  6. 添加仅具有读取权限(而非完全控制)的用户“NETWORK SERVICE”,然后应用
  7. 关闭 mmc

使用 regedit 添加一个名为 的新二进制值SSLCertificateSHA1HashHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp它所需的值是上面获得的证书的 SHA1 指纹:右键单击新值,选择修改,然后按顺序输入十六进制代码(不带冒号或空格或逗号,字母不区分大小写)——总共有 20 个十六进制对(40 个字符)。

您可能需要重新启动主机,或重新启动远程桌面服务(从 Services.msc)才能正常工作。

现在,使用正确的站点名称(例如 example.com)与此主机建立远程桌面连接后,您应该会在顶部连接栏左侧看到一个锁定的挂锁:单击此挂锁表示远程计算机的身份已得到验证。从互联网到此主机的开放端口现在应该通过 PCI-DSS 3.1 主机名测试。

答案2

以下是我使用的基本步骤:

获取主机的有效证书(它不必来自外部 CA,但您的所有机器都必须信任它)。确保它具有正确的主机名,我在使用通配符证书时遇到了问题。

在主机上安装证书,例如:

certutil.exe -p myPassword -importPFX c:\mycert.pfx noExport

在 UI 或 PowerShell 中查找证书的指纹:

$tp = (ls Cert:\LocalMachine\my | WHERE {$_.Subject -match "something unique in your certs subject field" } | Select -First 1).Thumbprint

现在告诉远程桌面使用该证书:

& wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="$tp" 

无需重启

答案3

我的证书附带 2 个所需文件,domain.crt然后domain.ca-bundledomain.key从生成请求中获得我的文件。

以下是我使用 Linux VM 合并证书并生成指纹和使用 Windows CMD 设置主机的方法。这允许完整的设置脚本。

我的回答和@gogoud 的回答最大的区别是:

  • 我不编辑注册表。我试过了,但没有用,我wmic /namespace:通过 CMD 提示符使用。
  • 我定制了 Linux VM 上的“指纹”行,以删除指纹中所有不必要的部分,并将其设置为 Windows 所需的格式。(即:没有冒号,没有单词,只有带小写字母的指纹)。
  • 我还编写了添加NETWORK SERVICE权限的脚本。

创建一个工作目录并将 3 个文件移入其中:

domain.ca-bundle  domain.crt  domain.key 

创建 pfx 格式的密钥:

sudo openssl pkcs12  -export -out domain.pfx -inkey *.key -in *.crt -certfile *.ca-bundle

将 SSLCertificateSHA1Hash/FingerPrint 导出到 TXT 文件:

sudo openssl x509 -in *.crt -noout -fingerprint | sed -e 's/SHA1 Fingerprint=//g' | sed -e 's/://g' | tr '[:upper:]' '[:lower:]' > SSLCertificateSHA1Hash.txt

将证书导入 Windows(打开提升的 CMD 提示符):

  • 可以通过开关“-p MyPassword”进一步编写脚本

    certutil.exe -importpfx C:\domain.pfx
    

现在通过 CMD(提升的 CMD 提示符)将 SSLCertificateSHA1Hash 添加到 RDP-Tcp:

set /p FingerPrint=<C:\SSLCertificateSHA1Hash.txt
wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="%FingerPrint%"

您现在需要添加具有“只读”权限的用户“网络服务”:

icacls.exe "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\*" /grant "NETWORK SERVICE":R

重启主机:

 shutdown /r /t 5

相关内容