在 IIS 7.5 上一次替换多个站点上的通配符证书(使用命令行)

Chr*_*ris 7 ssl command-line-interface iis-7.5 ssl-certificate windows-server-2008-r2

我有 3 个网站:aaa.my-domain.combbb.my-domain.com并且ccc.my-domain.com*.my-domain.com在 IIS 7.5 Windows Server 2008R2 64 位上使用单个通配符证书。该证书将在一个月后到期,*.my-domain.com我的服务器上已准备好新的通配符证书。

我希望所有这些域都使用新的通配符证书而不会出现明显的停机时间。

我从替换 aaa.my-domain.com 的证书开始,通过 UI 尝试了通常的方法: 在 IIS 7.5 中编辑站点绑定窗口

但是当我按 OK 时,我收到以下错误:

--------------------------- 编辑站点绑定 -------------------- -------

至少有一个其他站点使用相同的 HTTPS 绑定,并且该绑定配置了不同的证书。您确定要重用此 HTTPS 绑定并重新分配其他站点以使用新证书吗?

--------------------------- 是 否 --------------------- ------

当我单击Yes 时,我收到以下消息:

--------------------------- 编辑站点绑定 -------------------- -------

与此绑定关联的证书也分配给另一个站点的绑定。编辑此绑定将导致其他站点的 HTTPS 绑定不可用。您还想继续吗?

--------------------------- 是 否 --------------------- ------

此消息告诉我https://bbb.my-domain.comhttps://ccc.my-domain.com将无法使用。而且至少在我完成替换这两个域的证书之前,我将有停机时间,对吗?

我在想,必须有一种更聪明的方法来做到这一点。可能通过命令行将通配符证书一次性替换为所有网站的新证书。我在网上找不到任何关于如何做到这一点的资源。有任何想法吗?

与通配符和绑定相关的站点:

与从命令行绑定证书相关的站点:

Chr*_*ris 12

答案的上下文是 IIS 7 实际上并不关心证书绑定。IIS 7 只将网站绑定到一个或多个套接字。每个套接字都是 IP + 端口的组合。来源:IIS7 从命令行向站点添加证书

所以,我们要做的是在OS层做证书重新绑定。操作系统层控制 SSL 部分,因此您可以netsh将证书与特定套接字相关联。这是通过netsh使用netsh http add sslcert.

当我们将(新)证书绑定到套接字(ip + 端口)时,所有使用该套接字的站点都将使用新证书。

将证书绑定到套接字的命令是: netsh http add sslcert ipport=10.100.0.12:443 certhash=1234567890123456789012345678901234567890 appid={12345678-1234-1234-1234-999999999999}

如何

这部分解释了如何逐步进行。它假设您有一些网站(aaa.my-domain.com、bbb.my-domain.com)正在运行即将到期的 *.my-domain.com 证书。您已经在服务器上安装了一个新证书,但尚未应用于 IIS 上的网站

首先,我们需要找出两件事。您的新证书和 appid 的证书。

  • certhash指定证书的 SHA 哈希值。该散列的长度为 20 个字节,并指定为十六进制字符串。
  • appid 指定 GUID 以标识拥有的应用程序,即 IIS 本身。

找到certhash

执行certutil命令获取机器上的所有证书:

certutil -store My

我不需要所有信息,所以我这样做:

certutil -store My | findstr /R "sha1 my-domain.com ===="

在输出中,您应该会发现您的服务器上已准备好新证书:

================ Certificate 5 ================ Subject: CN=*.my-domain.com, OU=PositiveSSL Wildcard, OU=Domain Control Validated Cert Hash(sha1): 12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 12 34 56 78 90

1234567890123456789012345678901234567890certhash我们要找的。它是没有空格的证书哈希(sha1)。

找到应用程序

让我们从查看所有证书套接字绑定开始

netsh http show sslcert

或者特别是一个插座

netsh http show sslcert ipport=10.100.0.12:443

输出:

SSL Certificate bindings:
----------------------
IP:port                 : 10.100.0.12:443
Certificate Hash        : 1111111111111111111111111111111111111111
Application ID          : {12345678-1234-1234-1234-123456789012}
Certificate Store Name  : MY
Verify Client Certificate Revocation    : Enabled
Verify Revocation Using Cached Client Certificate Only    : Disabled
Usage Check    : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout   : 0
Ctl Identifier          : (null)
Ctl Store Name          : (null)
DS Mapper Usage    : Disabled
Negotiate Client Certificate    : Disabled
Run Code Online (Sandbox Code Playgroud)

{12345678-1234-1234-1234-123456789012}appid我们要找的。它是 IIS 本身的应用程序 ID。在这里您可以看到套接字10.100.0.12:443当前仍绑定到旧证书(哈希 111111111...)

将(新)证书绑定到套接字

打开命令提示符并以管理员身份运行它。如果您不以管理员身份运行它,您将收到如下错误:“请求的操作需要提升(以管理员身份运行)”。

首先使用此命令删除当前的证书套接字绑定

netsh http delete sslcert ipport=10.100.0.12:443

你应该得到:

SSL Certificate successfully deleted

然后使用此命令(在此处找到)添加带有 appid 的新证书套接字绑定和您之前使用此命令找到的 certhash(无空格)

netsh http add sslcert ipport=10.100.0.12:443 certhash=1234567890123456789012345678901234567890 appid={12345678-1234-1234-1234-123456789012}

你应该得到:

SSL Certificate successfully added

完毕。您刚刚替换了绑定到此 IP + 端口(套接字)的所有网站的证书。