我有 3 个网站:和aaa.my-domain.com
,它们都在 IIS 7.5 Windows Server 2008R2 64 位上使用单个通配符证书。该证书将在一个月后过期,我的服务器上已准备好新的通配符证书。bbb.my-domain.com
ccc.my-domain.com
*.my-domain.com
*.my-domain.com
我希望所有这些域名都能使用新的通配符证书,并且不会出现明显的停机时间。
我尝试通过 UI 进行常规操作,首先替换 aaa.my-domain.com 的证书:
但是当我按“确定”时,出现以下错误:
--------------------------- 编辑站点绑定 ---------------------------
至少有一个其他站点正在使用相同的 HTTPS 绑定,并且该绑定配置了不同的证书。您确定要重新使用此 HTTPS 绑定并重新指定其他站点使用新证书吗?
--------------------------- 是 否 ---------------------------
当我点击是的,我收到以下消息:
--------------------------- 编辑站点绑定 ---------------------------
与此绑定关联的证书也已分配给另一个站点的绑定。编辑此绑定将导致另一个站点的 HTTPS 绑定不可用。是否仍要继续?
--------------------------- 是 否 ---------------------------
这条消息告诉我https://bbb.my-domain.com和https://ccc.my-domain.com将变得无法使用。并且至少在我完成替换这两个域名的证书之前,这些域名也会处于停机状态,对吗?
我在想,一定有更聪明的方法可以做到这一点。可能是通过命令行一次性用新证书替换所有网站的通配符证书。我在网上找不到任何关于如何做到这一点的资源。有什么想法吗?
与通配符和绑定相关的站点:
- http://www.diaryofaninja.com/blog/2010/09/01/binding-multiple-domains-to-a-wildcard-ssl-on-a-single-ip-in-iis-75
- http://www.computer-howto.com/2011/08/running-multiple-ssl-iis-sites-iis7-75/
- https://stackoverflow.com/questions/3895675/how-to-install-wildcard-ssl-cert-on-iis-7-5
- http://blogs.msdn.com/b/asiatech/archive/2010/12/27/setting-up-a-wildcard-certificate-in-iis-7-how-to-avoid-those-certificate-mismatch-errors.aspx
与从命令行绑定证书相关的站点:
答案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
1234567890123456789012345678901234567890
是certhash
我们正在寻找的。它是没有空格的证书哈希值(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 + 端口(套接字)的所有网站的证书。