IIS:在多台 Web 服务器上管理多个证书
08/17/2016
本文内容
管理大量安全证书是一项繁琐的工作,您可以使用 Windows PowerShell 来加快这一过程。
Jason Helmick
管理在大型 Web 环境中的证书是一个大型的挑战。 可能有数百台服务器承载成百上千的 SSL Web 站点,都具有独特的证书。 安装和维护这种规模上的证书是一个耗时的过程与 GUI 的 IIS 管理器。
没有恐惧 — — 那里是的更好方法。 是否您有两个或 200 的 Web 服务器,Windows PowerShell 可以变成天、 几周或几个月你的时间仅仅几分钟。 整个部署、 安装和配置证书和 SSL,为您的 Web 站点的过程中,有一些技巧可以使用查找证书将要过期所以您可以替换他们的。
地面规则很简单:这适用于 IIS 7.5 和 IIS 8,但您需要启用 Windows PowerShell 远程处理。 此示例中,有两个在自己的群集 IP 地址的负载平衡配置的 Web 服务器。 每个正在运行三个新的 Web 站点需要用于 SSL 的证书和绑定。 我已改变了代码中的群集 IP 地址到内部地址来掩盖实际的 Web 站点,但你知道了。 我购买了我新的证书,并已准备好部署的.pfx 文件。 这里是断开的现有的 Web 站点:
— — IP 地址 192.168.3.201 — — Shop.Company.com 证书: shop.company.com.pfx
— — IP 地址 192.168.3.202 — — Update.Company.com 证书: update.company.com.pfx
— — IP 地址 192.168.3.203 — — Register.Company.com 证书: register.company.com.pfx
通过部署和负载平衡的 Web 服务器上安装证书开始吧。
部署和安装
您需要两件东西入门 — — 一个变量,其中包含 Web 服务器的计算机名称和 Windows PowerShell 与每个服务器的远程会话的列表。 我的计算机的名称来自我的计算机上的一个文本文件,但你可以抓住他们从 Active Directory 如果 Web 服务器是一个域的成员:
PS> $servers = Get-Content c:\webservers.txt PS> $session = New-PsSession –ComputerName $servers
复制到远程服务器的证书,这样您可以轻松地安装它们。 不要担心有人偷你的.pfx 文件。 完成这一节之前,您将它们删除。 对于本演示,我的.pfx 文件是我的客户端计算机 c:\sites\certpfx 上:
PS> $servers | foreach-Object{ copy-item -Path c:\sites\certpfx\*.* -Destination "\\$_\c$"}
CertUtil.exe 是通过 Windows PowerShell 远程处理会话安装证书的极佳工具。 在下面的一行,每个 Web 服务器将安装的证书。 请记住,有三个证书安装 (一个用于每个 Web 站点),因此我重复命令:
PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\shop.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\update.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\register.company.com.pfx}
当您使用 CertUtil.exe 时,您需要指定为.pfx 的密码。 因为我在实时执行这,刚刚键入的密码。 如果你要生成脚本,我建议用一个变量,如从提示符处获取的密码替换密码:
PS> $Cred = (Get-Credential).password
请确保要删除的.pfx 文件从远程的 Web 服务器,以防止任何可能的证书盗窃:
PS> $servers | foreach-object {Remove-Item -Path "\\$_\c$\*.pfx"}
在远程服务器上安装的证书,与下一步是创建 Web 站点的 HTTPS 绑定。
创建 Web 站点绑定
在负载平衡的每个服务器上的每个 Web 站点需要 HTTPS 绑定。 使用 WebAdministration 模块从新 WebBinding cmdlet 和进程将管理单元。 Cmdlet 的参数指定的网站名称、 协议、 端口和群集 IP 地址的站点。 SSLFlags 确定您将使用绑定的证书位于何处:
PS> Invoke-Command -session $session {Import-Module WebAdministration} PS> Invoke-command -Session $session { New-WebBinding -name shop -Protocol https -Port 443 -IPAddress 192.168.3.201 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name update -Protocol https -Port 443 -IPAddress 192.168.3.202 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name register -Protocol https -Port 443 -IPAddress 192.168.3.203 -SslFlags 0}
您刚刚的证书安装在 Windows 证书存储中,但这里有选项:
0 — — 经常在 Windows 证书存储中的证书
1 — — 服务器名称指示 (SNI) 证书
2 — — 中央的证书存储区
3 — — SNI 中央的证书存储区中的证书
还有最后一步才能完成,这是经常被忽略和遗忘:链接到新的 Web 站点绑定的证书。
绑定证书
最后这一步可能会造成混淆。 图形 IIS 管理器中隐藏的过程中,这一部分,但你不能离开它如果您希望您的站点,使用 SSL。 您必须将该证书链接到的 Web 站点绑定。
这是一个两阶段的过程。 首先,您必须为每个 Web 站点获取证书的指纹,这样它可以创建适当的 SSL 绑定。 请记住,我正与在此示例中的三个 Web 站点。 我需要从每个唯一的证书指纹。 我选择了在三个不同的变量中存储指纹,所以我并没有将它们混为一谈时将它们链接到的 Web 站点:
PS> Invoke-Command -session $session { $CertShop=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*shop*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertUpdate=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*update*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertRegister=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*register*"} | Select-Object -ExpandProperty Thumbprint}
现在正是时候使用指纹来抓取整个证书并将其指定为每个 Web 站点的 SSL 绑定。 下面的命令使用 Get 项目来抓取该证书,然后新项目创建 SSL 绑定 ; IIS:\SSLBindings IIS 提供程序创建的 SSL 绑定和绑定信息:
PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certShop" | new-item -path IIS:\SslBindings\192.168.3.201!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certUpdate" | new-item -path IIS:\SslBindings\192.168.3.202!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certRegister" | new-item -path IIS:\SslBindings\192.168.3.203!443}
在 IIS 中绑定信息通常显示为 IPAddress:Port:Hostname (*: 80: *)。 但是,Windows PowerShell 解释冒号 (:) 作为路径的一个指标。 当您使用 Windows PowerShell 设置绑定信息时,则使用感叹号 (!)。
绑定现已完成,你可以到达网站使用 HTTPS,如下所示:
检查过期
有另一个有用的解决方案,它采用您刚刚学到的所有信息。 它是为你们中许多人共同的业务挑战:是您的证书将要过期吗?
管理证书的一部分确定是否一些即将过期,所以您可以替换它们。 您可以应用的概念和对这一问题在此处使用的战术。 你只需要一个更多一行程序。 再次,您仍然需要一个 Windows PowerShell 远程处理会话打开您想要检查过期证书的 Web 服务器。
下面的示例将扫描的 localmachine 证书存储区中的所有证书。 它比较证书过期属性 notafter 到自定义的列中的当前日期,我命名为 ExpireInDays。 (在哪里-对象) 筛选器检查,看是否任何证书有少于 90 天,在到期之前。 命令可以列出的服务器名称和证书即将过期:
PS> Invoke-Command -Session $session { Get-ChildItem -Path Cert:\LocalMachine\My | Select-Object -Property PSComputerName, Subject, @{ n='ExpireInDays';e={($_. notafter - (Get-Date)).Days}} | Where-Object {$_.ExpireInDays -lt 90}}
使用所有你学会了这里,你可以成功并迅速替换所有这些证书 — — 即使在大尺度上 — — 使用 Windows PowerShell。
Jason Helmick接口技术培训,设在亚利桑那州凤凰城是 Windows PowerShell 技术主任 他是扬声器、 作者、 老师和无意 IIS 管理员。
相关的内容