为 Windows 远程桌面添加证书,通过 RDP 连接不再显示证书问题。一次管5年

最近又在折腾 Windows 了,然后在通过 RDP 连接的时候总要提示证书错误。

于是找到一篇文章,用自建证书解决了这个问题:

生成更长有效期的 RDP SSL 自签名证书

具体命令(PowerShell):

$newcert = New-SelfSignedCertificate -Subject "CN=$([System.Net.Dns]::GetHostName())" -KeyLength 4096 -NotAfter $([datetime]::Now.AddYears(5)) -KeyExportPolicy NonExportable -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1", "2.5.29.19={critical}{text}ca=0") -Type SSLServerAuthentication -CertStoreLocation Cert:\LocalMachine\My\

Set-CimInstance -Namespace 'root\cimv2\TerminalServices' -Query 'SELECT * FROM Win32_TSGeneralSetting WHERE TerminalName = "RDP-Tcp"'  -Property @{ SSLCertificateSHA1Hash = $newcert.Thumbprint }

重启后,通过 RDP 连接的时候,第一次需要信任证书,后面就不需要了,一次管五年。

另外,让 AI 解释了下这两行:


第一行

这是在使用 PowerShel 创建一个自签名的 SSL 服务器验证证书的命令。

  • New-SelfSignedCertificate 是创建新的自签名证书的命令。
  • -Subject “CN=$([System.Net.Dns]::GetHostName())” 设置了证书的主题名称是本机的主机名。
  • -KeyLength 4096 设置了证书的密钥长度为4096位。
  • -NotAfter $([datetime]::Now.AddYears(5)) 设置了证书的过期日期是从当前时间开始的5年后。
  • -KeyExportPolicy NonExportable 表示生成的私钥无法被导出。
  • -TextExtension 是一种扩展证书性能的方式,这里是设置证书的用途和基本约束。
  • -Type SSLServerAuthentication 是告诉 PowerShell,我们正在创建一个用于 SSL 服务器验证的证书。
  • -CertStoreLocation Cert:\LocalMachine\My\ 是将新的 SSL 证书存储在本地计算机的个人证书存储中。

总的来说,这个命令在本地计算机上创建了一个新的,用于 SSL 服务器验证的,有效期为5年,非导出并存储在本地个人证书存储的自签名证书,并且主题名称设置为本机的主机名。

1.3.6.1.5.5.7.3.1 是一个对象标识符(Object Identifier, OID)的值,用于在证书中描述某些特性或者用途。

具体来说,1.3.6.1.5.5.7.3.1 是服务器身份验证(Server Authentication)的 OID,它说明这个证书可以用于 SSL/TLS 服务器身份验证。这个OID通常会出现在 X.509证书的扩展密钥使用(Extended Key Usage, EKU)部分。

各部分的解读如下:

  • 1.3.6.1.5.5.7 是基于Internet的公钥基础设施(PKIX)的OID;
    *.3 是扩展密钥使用(EKU)的OID;
  • .1 是服务器身份验证的EKU。

第二行

这是在使用 PowerShell 来设置远程桌面协议 (RDP) 服务的 SSL 证书。

  • Set-CimInstance 是一个命令,用于修改 Common Information Model(CIM)实例的属性值。
  • -Namespace ‘root\cimv2\TerminalServices’ -Query ‘SELECT * FROM Win32_TSGeneralSetting WHERE TerminalName = “RDP-Tcp”’ 这部分用于从 ‘root\cimv2\TerminalServices’ 命名空间选择名为 “RDP-Tcp” 的终端服务的所有一般设置(general settings)。
  • -Property @{ SSLCertificateSHA1Hash = $newcert.Thumbprint } 这部分则是用于设置 RDP 服务的 SSL 证书的 SHA1散列值,该值便是我们之前创建的自签名模式SSL证书的 Thumbprint。

很需要,不过这是在服务端运行还是客户端运行?

服务器端

这个可以更多吗,比如99?

可以的,

对于自签名证书,可以指定任何您希望的时长。您可以将5年修改为更长的时间,例如10年或20年,直到达到DateTime结构的最大可能值,也就是公元9999年12月31日。所以,理论上,最长有效期可以设定为超过8000年。但实际上,这样的有效期在大多数情况下没有实际意义。

我记得默认半年吧,这个时长还能接受。
5年一次,感觉和关了服务不生证书差不多了……

正好借地方问一下,RDP能不能配置成像SSH一样只能通过RSA密钥登陆,暴露到公网总觉得有点隐患。

看看这个呢