使用新证书自动重新配置 WinRM HTTPS 侦听器?

使用新证书自动重新配置 WinRM HTTPS 侦听器?

我希望在所有服务器上启用 WinRM HTTPS 侦听器,以便在服务器之间使用 CredSSP 时进行安全通信,以绕过双跳问题

设置这个就可以了,我们拥有来自内部 CA 的 CN 适用证书,因此侦听器的初始设置很好并且运行良好。唯一的问题是这些证书的有效期仅为 1 年,因此一旦它们过期,我们就需要在每台服务器上重新配置侦听器,因为服务器证书的自动注册不会修改 WinRM 配置中的证书指纹。

有没有人遇到过这个问题的好解决办法?

答案1

我最近编写了一个简短的脚本,以便完成您要完成的相同任务,以下是相关部分。请注意,最后您会收到错误,因为在等待 Restart-Service 命令的结果时,Invoke-Command 将重置 WinRM 服务...

$yourCred = Get-Credential domain\account
$yourServer = "your.server.fqdn"

$LatestThumb = Invoke-Command -ComputerName $yourServer `
                            -Credential $yourCred `
                            -ScriptBlock {
                                Get-ChildItem -Path Cert:\LocalMachine\My |
                                Where-Object {$_.subject -match "CN=$yourServer"} |
                                Sort-Object -Property NotAfter |
                                Select-Object -Last 1 -ExpandProperty Thumbprint
                            }

Set-WSManInstance -ResourceURI winrm/config/Listener `
                  -SelectorSet @{Address="*";Transport="HTTPS"} `
                  -ComputerName $yourServer `
                  -Credential $yourCred `
                  -ValueSet @{CertificateThumbprint=$LatestThumb}

Invoke-Command -ComputerName $yourServer `
               -Credential $yourCred `
               -ScriptBlock { Restart-Service -Force -Name WinRM }

这是针对 Server 2008 R2 和 Posh v3 运行的。我敢打赌它适用于 Server 2012,但对于 v2 可能需要做一些工作。

答案2

您通常会使用该Set-WSManQuickConfig -UseSSL命令在 WinRM 服务上配置 SSL 证书。或者,您可以手动使用Set-Item该命令在 WinRM 服务上配置指纹。请参阅下面的示例。

Set-Location -Path WSMan:\localhost\Service;
Set-Item -Path .\CertificateThumbprint -Value 'THUMBPRINT';

笔记:确保您部署的是最新版本的 Windows Management Framework Core(包括 PowerShell)。我最近遇到了一个客户问题,cmdletSet-WSManQuickConfig无法正确识别证书存储中的有效 SSL 证书。

答案3

我知道这篇文章已经过时了,但我想分享我想到的一个解决方案。在我们的 CA 上,我创建了一个使用相同密钥续订的证书模板。兼容性设置必须是 CA 服务器 2012 R2 或更高版本,才能获得使用相同密钥续订的选项。我制作了证书自动注册。

这是我整理的脚本。我创建了一个 SCCM 包,按计划运行它。

if (dir wsman:\localhost\listener | where {$_.Keys -like "Transport=https*"})
{
Write-Host "Already enabled"
exit
}
Else
{
#Variables
$zone = ".yourdomain.com"
$fqdn = "$env:computername$zone"
$Thumbprint = certutil -store My "Cert Template Name" | findstr /c:"Cert Hash(sha1)"
# removing cert hash(sha1): and the space after it
$discard,$keep=$Thumbprint.split(":")
$TP = $Keep -replace '\s',''
#enable WinRM HTTPS
winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="'"$fqdn"'"; CertificateThumbprint="'"$TP"'"}'
}

希望这可以帮助任何想要广泛实施此领域的人。

相关内容