如何用PowerShell更新IIS多站点的不同SSL绑定证书?
解决IIS站点指定绑定更新证书的问题
精准更新单个绑定的证书
你之前的脚本会更新所有绑定,核心原因是没有精准筛选目标绑定。可以通过Get-WebBinding结合条件过滤,定位到具体的绑定后再更新证书,避免误操作其他绑定。
示例脚本:
# 配置目标参数 $siteName = "你的站点名称" $bindingProtocol = "https" $bindingHostHeader = "example.com" # 无主机头绑定留空或设为$null $bindingPort = 443 $newCertThumbprint = "新证书的指纹(可从证书管理器中复制)" # 筛选目标绑定 $targetBinding = Get-WebBinding -Name $siteName -Protocol $bindingProtocol | Where-Object { # 根据实际绑定类型调整筛选条件 $_.HostHeader -eq $bindingHostHeader -and $_.Port -eq $bindingPort } # 执行证书更新 if ($targetBinding) { # "My" 代表证书存储位置为当前用户的个人存储区,若证书在本地计算机存储区则用 "LocalMachine" $targetBinding.AddSslCertificate($newCertThumbprint, "My") Write-Host "已成功更新站点 [$siteName] 中 [$bindingHostHeader:$bindingPort] 的证书" } else { Write-Warning "未找到站点 [$siteName] 中匹配的绑定,请检查参数是否正确" }
如果是无主机头的IP绑定,修改筛选条件为:
$targetBinding = Get-WebBinding -Name $siteName -Protocol $bindingProtocol | Where-Object { $_.IPAddress -eq "192.168.1.100" -and $_.Port -eq $bindingPort -and [string]::IsNullOrEmpty($_.HostHeader) }
解决set-WebBinding "目标配置对象未找到" 警告
这个警告通常是参数不匹配导致的,排查方向:
- 站点名称区分大小写,必须与IIS管理器中显示的完全一致
- 检查绑定的协议、端口、主机头/IP是否和实际配置一致(比如有些https绑定可能没设主机头,只用IP+端口)
- 若绑定使用了通配符证书或SNI,确保筛选条件覆盖这些场景
多服务器批量处理方案
如果需要同步更新多台IIS服务器的绑定证书,可结合Invoke-Command远程执行脚本:
# 定义目标服务器列表 $servers = @("Server01", "Server02", "Server03") # 定义所有需要更新的绑定配置 $bindingConfigs = @( @{ SiteName = "SiteA" Protocol = "https" HostHeader = "a.example.com" Port = 443 CertThumbprint = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" CertStore = "My" # 证书存储位置 }, @{ SiteName = "SiteB" Protocol = "https" IPAddress = "192.168.1.200" Port = 443 CertThumbprint = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" CertStore = "LocalMachine" } ) # 远程执行更新逻辑 Invoke-Command -ComputerName $servers -ScriptBlock { param($configs) foreach ($config in $configs) { # 根据配置类型筛选绑定 $filterScript = if ($config.HostHeader) { { $_.HostHeader -eq $config.HostHeader -and $_.Port -eq $config.Port } } else { { $_.IPAddress -eq $config.IPAddress -and $_.Port -eq $config.Port -and [string]::IsNullOrEmpty($_.HostHeader) } } $targetBinding = Get-WebBinding -Name $config.SiteName -Protocol $config.Protocol | Where-Object $filterScript if ($targetBinding) { $targetBinding.AddSslCertificate($config.CertThumbprint, $config.CertStore) Write-Host "[$env:COMPUTERNAME] 已完成站点 [$($config.SiteName)] 的绑定更新" } else { Write-Warning "[$env:COMPUTERNAME] 未找到站点 [$($config.SiteName)] 的匹配绑定" } } } -ArgumentList @($bindingConfigs)
注意:执行远程脚本需要目标服务器开启WinRM服务,且当前用户拥有目标服务器的管理员权限。
内容的提问来源于stack exchange,提问作者andry79
相关产品推荐
相关产品推荐

