博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IIS:在多个Web服务器上管理多个证书
阅读量:5730 次
发布时间:2019-06-18

本文共 4862 字,大约阅读时间需要 16 分钟。

原文:

在大规模的Web环境管理证书是巨大的挑战。可能有上百台服务器拥有上百个SSL Web站点,都使用唯一的证书。在这么大规模的背景下,使用IIS管理器的图形界面来安装和维护证书是一个耗时的过程。

不用害怕,有更好的方法。无论你有2个或者200个Web服务器,Windows PowerShell会将数日、数周或数月的时间消耗减少为几分钟。贯穿部署、安装和配置证书和站点的SSL,有方法可以定位到即将过期的证书,以便你可以替换它们。

基本规则很简单:工作在IIS 7.5和IIS 8,但是你需要启用Windows PowerShell远程。例如,有两个Web服务器配置在一个负载均衡里,有它们自己的集群IP地址。每一个运行3个新的需要绑定证书的SSL Web站点。在代码里,我已经修改了集群IP地址为内部地址,而隐藏了实际的Web站点,但你能获得原理。我购买了新证书,并准备部署.pfx文件。这是站点的概要:

  • Shop.Company.com – IP Address 192.168.3.201 – Cert: shop.company.com.pfx

  • Update.Company.com – IP Address 192.168.3.202 – Cert: update.company.com.pfx

  • Register.Company.com – IP Address 192.168.3.203 – Cert: register.company.com.pfx

让我们开始在负载均衡的Web服务器部署和安装证书。

Part1:部署和安装

你需要开始做两件事 – 定义一个变量,包含Web服务器计算机名的的列表,另一个变量,到那些服务器上的每一台的Windows PowerShell远程会话。计算机名来自于一个文本文件,但是如果Web服务器是域成员,你可以从活动目录收集:

1
2
PS> 
$servers 
Get-Content 
c:\webservers.txt
PS> 
$session 
New-PsSession 
–ComputerName 
$servers

拷贝证书到远程服务器,以便于你安装它们。不用担心某人偷走了你的.pfx文件。在这个步骤完成前不要删除它们。需要说明的是,我的.pfx文件位于我客户端计算机的c:\sites\certpfx目录下:

1
2
PS> 
$servers 
foreach-Object
{
copy-item 
-Path c:\sites\certpfx\*.* -Destination 
"\\$_\c$"
}

CertUtil.exe是通过Windows PowerShell远程会话安装证书的伟大工具。在以下每一行,每个Web服务器将会安装证书。记住,有3个证书被安装(每个站点1个),所以我重复了这个命令:

1
2
3
4
5
6
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指定密码。因为我在实践中执行,只需要输入密码。如果你创建一个脚本,我推荐将密码替换为从提示获取密码的变量,例如:

1
PS> 
$Cred 
= (
Get-Credential
).password

确保从远程Web服务器删除.pfx文件,以防任何可能的证书失窃:

1
PS> 
$servers 
foreach-object 
{
Remove-Item 
-Path 
"\\$_\c$\*.pfx"
}

随着在远程服务器上安装了证书,接下来为Web站点创建HTTPS绑定。

Part2:创建Web站点绑定

在负载均衡的每个服务器上的每个Web站点需要绑定HTTPS。使用WebAdministration模块的New-WebBinding,该功能将会成为一个管理单元。参数指定了站点名,协议,端口和站点的集群IP地址。SslFlags决定了用户绑定的证书的位置。

1
2
3
4
5
6
7
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 – Server Name Indication (SNI)证书

  •  2 – 中央证书存储

  •  3 – 在中央证书存储中的SNI证书

还有最后一步要完成,常常容易忘记:连接证书到新的Web站点绑定。

Part3:绑定证书

最后一步令人迷惑。图形IIS管理器隐藏了这一步的处理,如果你想站点使用SSL正常工作,你必需得做。你需要连接证书到Web站点的绑定。

这是一个两阶段过程。首先,你得获得每个Web站点的证书的指纹,因此你可以创建一个合适的SSL绑定。记住,这个例子里我们有3个站点。我需要每个唯一证书的指纹。我选择存储指纹到3个不同的变量,因此,当我连接到Web站点时不会混淆:

1
2
3
4
5
6
7
8
9
10
11
12
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-item来收集证书,然后New-item创建SSL绑定;IIS提供者IIS:\SslBindings使用以下绑定信息创建了SSL绑定:

1
2
3
4
5
6
7
8
9
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来访问Web站点,描述如下:

1
2
3
PS> start iexplore https://shop.company.com
PS> start iexplore https://update.company.com
PS> start iexplore https://register.company.com

Part4:检查过期

有另一个有用的解决方案涵盖了刚才你所学的所有信息。对于你们中的大多数来说是一个普通的商业挑战:你的证书是否即将过期?

管理证书的部分工作是,确定是否即将过期,以便你可以替换它们。对于这个问题,你可以应用这个主题的技巧。只需要一行行来。你还需要对所有需要检查证书过期的Web服务器启用Windows PowerShell远程会话。

以下示例在localmachine证书存储中扫描了所有的证书。它将自定义变量ExpireInDays的过期属性notafter与当前时间比较。过滤器(Where-Object)检查了过期时间少于90天的证书。这个命令列出了服务器名和即将过期的证书:

1
2
3
4
5
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替换掉那些证书,即便规模很大。

本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1885148 ,如需转载请自行联系原作者

你可能感兴趣的文章
转载--配置WAMP开发环境
查看>>
文章相似度比较
查看>>
Java NIO学习笔记 三 散点/收集 和频道转换
查看>>
web.xml中<load-on-start>n</load-on-satrt>作用
查看>>
python之路---进程
查看>>
python中,如何将字符串转换为数字(将数字转换为整型),字符串的10转换为整型的10,10.5转换为10...
查看>>
1061. Dating (20)
查看>>
第二次实验的感悟
查看>>
【机器学习】一些基本概念及符号系统
查看>>
页面留白问题
查看>>
因为时间少
查看>>
leetcode 【 Best Time to Buy and Sell Stock II 】python 实现
查看>>
推荐15款创建漂亮幻灯片的 jQuery 插件
查看>>
【算法】CRF
查看>>
windows 8 微软拼音输入法
查看>>
Windows UI风格的设计(7)
查看>>
3. 指针的赋值
查看>>
linux小常识
查看>>
SQL中使用WITH AS提高性能 使用公用表表达式(CTE)简化嵌套SQL
查看>>
聊聊TaskExecutor的spring托管
查看>>