我有一台 Azure VM,其中启用了 PowerShell 远程处理,并且 WinRM 已将 HTTPS 侦听器配置为使用自签名证书。我可以使用 PowerShell 从 Internet 另一端的另一台计算机在 VM 上启动一些命令:
$cred = Get-Credential
$option = New-PSSessionOption -SkipCACheck
$psSession = New-PSSession -UseSSL -ComputerName $vmHostName -SessionOption $option -Credential $cred
Invoke-Command -Session $psSession -ScriptBlock { Write-Host $env:COMPUTERNAME }
我读从安全角度看 WinRM 的工作原理。与虚拟机的连接受到保护,可防止被动攻击者(机密性)甚至一些主动攻击者(完整性)。但是,由于忽略了签署证书的 CA,因此缺少针对 MitM(真实性)的保护。
我尝试找到一个选项来将证书的指纹固定在客户端,但我发现只有-SkipCACheck
。据我所知,winrs
甚至没有那么多。我正在考虑在客户端计算机上的 Cert:\LocalMachine\Root 中安装自签名证书以使其受信任,但这对我公司的 DevOps Server 代理来说可能更难,因为它们不由我的团队管理,而是与其他团队共享。
我看到使用自签名证书的教程和-SkipCACheck
全部 超过这个地方。只有几个不要使用自签名证书。我想知道为什么没有警告和提示如何保护它,就演示了这种不安全的设置。即使在 Server Fault 上,我的困惑也是并不独特。
当我需要通过公共互联网连接到虚拟机时,我该怎么做?有没有一种安全的方法来使用 WinRM 的自签名证书?有没有一种简单的方法可以为机器上的 WinRM 列表程序获取受信任的证书?
答案1
只需使用受信任的证书,而不是自签名证书。
将 ACME 协议与其中一个免费 CA(Let's Encrypt、ZeroSSL、Buypass Go SSL)结合使用既简单又安全。温ACME是适用于 Windows 的 ACME 客户端,它配置简单,并且具有设置和维护证书所需的一切。
作为 WinACME 中的证书安装步骤,即证书颁发/更新后运行的步骤,使用脚本插件在Scripts\ImportWinRM.ps1
WinACME 安装目录中,将{CertThumbprint}
其作为参数列表传递(按字面意思)。脚本:
- 使用指纹在 Cert:\LocalMachine 中找到证书,
- 将证书复制到 Cert:\LocalMachine\My,除非它已经存在,
- 根据匹配的主机名查找 WinRM 监听器,
- 重新配置侦听器以使用该证书,并且
- 重新启动 WinRM 服务。
一旦 WinRM 侦听器使用受信任的证书,请不要忘记-SkipCACheck
在客户端上进行删除。
$cred = Get-Credential
$psSession = New-PSSession -UseSSL -ComputerName $vmHostName -Credential $cred
Invoke-Command -Session $psSession -ScriptBlock { Write-Host $env:COMPUTERNAME }