如何获取IIS服务器全站点HTTP绑定完整列表排查证书冲突
修改IIS站点HTTPS绑定、选择新证书时,系统会弹出如下提示:
至少有一个其他站点正在使用同一绑定,且该绑定配置了不同证书。是否确定要重用此HTTP绑定,将其他一个或多个站点重新分配为使用新证书?
该提示代表当前操作的绑定(IP+端口+主机名组合,未启用SNI时仅匹配IP+端口)已被其他站点关联了不同证书,确认操作后所有共用该绑定的站点都会被替换为新选证书,站点规模越大受影响范围越广。服务器部署数百个站点时手动逐个排查效率极低,可通过以下方法批量获取全站点绑定列表,快速定位冲突站点。
方法1:PowerShell+IIS模块导出全量绑定明细(推荐)
无需额外安装工具,直接以管理员身份打开PowerShell执行以下脚本,即可导出所有站点的绑定信息、对应证书指纹到CSV文件,方便筛选对比:
# 加载IIS管理模块 Import-Module WebAdministration # 遍历所有站点收集绑定信息 $allBindings = Get-ChildItem -Path IIS:Sites | ForEach-Object { $currentSite = $_ $_.Bindings.Collection | ForEach-Object { [PSCustomObject]@{ 站点名称 = $currentSite.Name 站点ID = $currentSite.Id 协议类型 = $_.protocol 绑定信息 = $_.bindingInformation 主机名 = $_.hostheader 证书指纹 = if ($_.certificateHash) { ($_.certificateHash | ForEach-Object { $_.ToString("X2") }) -join '' } else { "" } 证书存储 = $_.certificateStoreName 已启用SNI = [bool]($_.sslFlags -band 1) } } } # 导出到C盘根目录的CSV文件 $allBindings | Export-Csv -Path C:\IIS所有站点绑定清单.csv -NoTypeInformation -Encoding UTF8
拿到导出的CSV文件后,按以下规则筛选冲突项:
- 未启用SNI的HTTPS绑定:按
绑定信息(格式为IP:端口:)分组,同组内出现多个不同证书指纹的即为冲突绑定 - 已启用SNI的HTTPS绑定:按
绑定信息+主机名组合分组,同组内出现多个不同证书指纹的即为冲突绑定
方法2:appcmd命令行快速查看
如果不需要导出文件,只想快速查看绑定列表,可以管理员身份打开命令提示符,执行IIS自带的appcmd命令输出全站点绑定:%windir%\system32\inetsrv\appcmd list site
命令执行后会直接列出所有站点的名称、ID、绑定信息、对应证书哈希,可直接对照排查。
方法3:直接读取IIS核心配置文件
IIS所有站点配置统一存储在C:\Windows\System32\inetsrv\config\applicationHost.config文件中,可直接用文本编辑器打开,查找<sites>节点下每个站点的<binding>配置,标签内的bindingInformation、certificateHash属性和上述两种方法拿到的字段含义完全一致,可用于离线排查场景。
- 注意:非SNI模式下同IP+端口的HTTPS绑定只能关联一张证书,只要多个站点共用同一IP的443端口且未开启SNI,修改任意一个站点的证书都会触发弹窗,替换所有共用该IP:端口站点的证书。
内容的提问来源于stack exchange,提问作者KWallace

