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


15

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

  1. 当我们进行远程连接时,我们不能完全确定我们确实是在连接这台计算机,而不是某些劫持连接。
  2. 我们的网站未通过PCI-DSS 3.1符合性检查(必填项,因为我们使用的是通过互联网连接的销售点借记卡/信用卡机,因此未通过)。该检查报告此面向Internet的远程桌面端口上的致命错误:“ SSL自签名证书”和“主机名错误的SSL证书”。

如何获得充当服务器/主机的Windows 10 Pro(或Windows 7/8 / 8.1 Pro)计算机,以提供适当的SSL证书进行远程桌面验证?


1
您可以将自签名证书放入将连接到该计算机的每台计算机的证书存储中,这样仅可信任该自签名证书。您还可以获取由CA签名的证书,并且默认情况下,由于CA是受信任的,因此主机要使用的证书将受到信任。 除非获得CA签署的证书,否则您将无法解决PCI-DSS 3.1的合规性问题。 你应该那样做。
Ramhound

感谢@Ramhound,您说的很对,我需要一个由CA签名的证书-我现在有一个。
gogoud

Answers:


16

您可以将该主机设置为使用并出示(现有的,购买的)外部验证的SSL证书,从而(说明可能也适用于Windows 8和8.1,可能适用于Windows 7,也可能不适用)(部分基于Microsoft KB 2001849):

首先,您需要购买正版的经过验证的SSL证书。

如果您具有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个证书,其中之一是您的站点证书(例如mysite.com)。右键单击此站点证书,然后单击鼠标右键,选择“所有任务” /“管理私钥”…
  6. 添加仅具有读取权限(不是完全控制)的用户“网络服务”,然后应用
  7. 关闭mmc

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

您可能需要重新启动主机,或重新启动远程桌面服务(从Services.msc),然后才能运行。

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


我想为您投票数千次。它有效100%
Shockwaver

9

这是我使用的基本步骤:

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

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

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

在用户界面或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" 

无需重启


我的通配符SSL Cert可以正常工作,但是我仍然必须打开MMC并添加“网络服务权限”,否则它将无法正常工作。
FreeSoftwareServers

我能够在“ Windows 10”和“ Windows Server 2016”上导入通配符证书,但发现Windows Server没有certutil.exe。没什么大不了的,因为您可以手动将mycert.pfx导入到证书存储中。我不必打开MMC,也没有添加网络服务权限。
TMT

1

我的证书带有需要2个文件,domain.crtdomain.ca-bundle&然后我有我domain.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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.