如何使用 powershell 批量更改 IIS 中多个站点的 SSL 证书?

如何使用 powershell 批量更改 IIS 中多个站点的 SSL 证书?

我有一台服务器上有十几个站点,每个站点都有 HTTP 和 HTTPS 绑定,其中几个站点共享同一个根域,如下所示:

Name             Bindings
----             --
Site 1           www.contoso.com:80
                 www.contoso.com:443
Site 2           foobar.contoso.com:80
                 foobar.contoso.com:443
Site 3           www.example.com:80
                 www.example.com:443
etc.

现在,我使用的 SSL 证书,*.contoso.com,将于下周到期,所以我买了一个新的,导入了它,现在 IIS 可以使用它了。要使用旧证书替换每个绑定的证书,我现在必须转到每个站点,转到绑定,选择绑定:443并将其设置为使用新证书。对于只有一个站点来说这不是什么大问题,但我有几十个站点都在使用此证书运行!

我怎样才能轻松地切换所有*.contoso.comPowershell 如何将站点从旧证书迁移到新证书?

我已经查看过模块的文档IISAdministration,但是我未能找到允许我更改绑定以便使用不同证书的方法,而谷歌大多为我提供包括证书更新在内的解决方案,我已经使用我的证书提供商的网站处理过此事。

Contoso 是一个占位名称,并不是真正的公司。

答案1

上面的脚本对我来说不起作用,更复杂,需要安装额外的服务器组件才能使用。相反,我们可以直接更新现有的绑定。

下面修改后的代码更加简洁,并且减少了因尝试删除绑定并重新添加而导致实时站点中断的可能性。

# Get the new certificaate
$cert = Get-ChildItem Cert:\LocalMachine\my | Where Subject -Like "CN=<cert subject name>" #Find cert subject name with Get-ChildItem Cert:\LocalMachine\my.

# Go through each SSL binding listed in IIS
Foreach ($Binding in Get-WebBinding -Protocol "https") {
    
    $Binding.AddSslCertificate($cert.GetCertHashString(), "my")

}

答案2

这应该可以完成您想要使用WebAdministration模块的任务。我目前无法测试它,所以一定要先在一个绑定上尝试一下,以防我输入错误:

首先,确保您可以获得新证书。您可以按 FriendlyName/SubjectName/Thumbprint 等进行筛选。基本上,确保此命令仅为您返回一个证书:

Get-ChildItem Cert:\LocalMachine\my | Where FriendlyName -Like 'NewCertificate'

然后,此脚本将使用新证书重新创建 SSL 绑定。请先尝试手动运行每个步骤:

Import-Module WebAdministration

# Get the new certificaate
$cert = Get-ChildItem Cert:\LocalMachine\my | Where Subject -Like '*domain*'

# Go through each SSL binding listed in IIS
Foreach ($Binding in (Get-ChildItem IIS:\SslBindings\)) {
    
    # Remove current binding
    $Binding | Remove-Item

    # Add the binding again using the new certificate 
    # (Bindings using hostname instead of IP address use a slightly different path)
    if ($Binding.Host) {
        $cert | New-Item -path "IIS:\SslBindings\!$($binding.Port)!$($binding.Host)"
    } 
    Elseif ($Binding.IPAddress) {
        $cert | New-Item -path "IIS:\SslBindings\$($binding.IPAddress)!$($binding.Port)"
    }
}

我最初是根据 Terri Donahue 的帖子得出这个结论的这里,其中有更多关于该过程的细节和解释。

相关内容