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

目录

默认的 RDP 自签名证书有效期只有半年, 对于我来说太短, 一旦过期, 连接 rdp 时提示证书不受信任的警告就很烦恼, 信任或不信任都麻烦.

可以使用免费或收费的 SSL 证书, 并配置自动更新证书服务. 但这样还是有不便的地方, 所以我选择另一种方式: 生成更长有效期的自签名 SSL 证书, 但注意: 更长有效期的 SSL 证书可能增加安全风险.

为何不自建 CA ? 因为担心管理不善, 导致自建 CA 成为其他计算机的安全风险来源.

使用 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 }

现在, 重启计算机或者重启 “Remote Desktop Services” 服务即可使用新证书连接。

验证:

# 查看新证书的指纹
ls Cert:\LocalMachine\My\
# 查看指定的 SSL 证书指纹
Get-CimInstance -Namespace 'root\cimv2\TerminalServices' -Query 'SELECT * FROM Win32_TSGeneralSetting WHERE TerminalName = "RDP-Tcp"'

参数解释

第一条 powershell 命令生成一个自签名证书:

  • CN=计算机 hostname (Subject)
  • 有效期五年 (NotAfter)
  • 新证书不可导出私钥 (KeyExportPolicy)
  • 申明证书用途为 “Server Authentication” (TextExtension, Type)
  • 证书存放到 “本地计算机\个人” 区域, 区别于 “用户\个人证书” 区域 (CertStoreLocation)

第二条命令设置 RDP 服务使用的证书指纹, 设置会影响此注册表键:

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\WinStations\RDP-Tcp]
"SSLCertificateSHA1Hash"

注意/证书要求

  • 证书的私钥管理里面要允许 “Network Service” 读取私钥, 默认允许了, 可以不用修改. (certlm.msc > 个人 > 证书 > 选择证书 > 右键: 所有任务 > 私钥管理 > 安全)
  • 证书安装到 “本地计算机 > 个人” 存储区域中.
  • 证书必须有相对应的私钥.
  • 证书的用法为 : 服务器身份验证或者远程桌面服务验证(1.3.6.1.4.1.311.54.1.2)

使用其他工具生成

可以选择 openssl 或者微软的 makecert 工具:

makecert -r -pe -n CN="MyServer" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -b 01/01/2000 -e 01/01/2036
wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set  SSLCertificateSHA1Hash="指纹"

参考

微软官方文档关于证书的要求