如何

如何

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

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

我尝试通过 UI 进行常规操作,首先替换 aaa.my-domain.com 的证书: 在 IIS 7.5 中编辑站点绑定窗口

但是当我按“确定”时,出现以下错误:

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

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

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

当我点击是的,我收到以下消息:

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

与此绑定关联的证书也已分配给另一个站点的绑定。编辑此绑定将导致另一个站点的 HTTPS 绑定不可用。是否仍要继续?

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

这条消息告诉我https://bbb.my-domain.comhttps://ccc.my-domain.com将变得无法使用。并且至少在我完成替换这两个域名的证书之前,这些域名也会处于停机状态,对吗?

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

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

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

答案1

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

因此,我们想要做的是在 OS 层重新绑定证书。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 上的网站

首先,我们需要找出两个东西。新证书的 certhash 和 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)。

查找 appid

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

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

{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 + 端口(套接字)的所有网站的证书。

相关内容