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

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

我希望所有这些域都使用新的通配符证书,而不会显着停机。

我尝试通过用户界面通常取代aaa.my-domain.com证书开始: 在IIS 7.5中编辑站点绑定窗口

但是当我按下确定,我得到以下错误:

—————————编辑网站绑定——————– ——-

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

—————————是否——————— ——

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

—————————编辑网站绑定——————– ——-

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

—————————是否——————— ——

此消息告诉我, https://bbb.my-domain.com和https://ccc.my-domain.com将变得不可用。 而且至less在我完成这两个领域的证书replace之前,我将会有宕机,对吗?

我在想,这样做肯定有一个更明智的方法。 可能通过命令行立即replace所有网站的新通配符证书。 我在网上找不到任何资源如何做到这一点。 有任何想法吗?

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

  • 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

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

  • IIS7从命令行添加证书到站点
  • https://stackoverflow.com/questions/591597/how-to-assign-a-ssl-certificate-to-iis7-site-from-command-prompt

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

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

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

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

如何

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

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

  • certhash指定证书的SHA哈希。 这个哈希是20个字节长,并指定为一个hexstring。
  • appid指定GUID以标识拥有的应用程序,即IIS本身。

findcerthash

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

certutil -store My

我不需要所有的信息,所以我需要:

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

在输出中,您应该可以在服务器上find新的证书:

================ 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 。 它是没有空格的Cert Hash(sha1)。

findappid

我们先看看所有的证书套接字绑定 :

netsh http show sslcert

或者特别是一个sockets

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 …)

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

打开命令提示符并以pipe理员身份运行。 如果不以pipe理员身份运行,则会显示如下错误信息:“请求的操作需要提升(以pipe理员身份运行)”。

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

netsh http delete sslcert ipport=10.100.0.12:443

你应该得到:

SSL Certificate successfully deleted

然后使用这个命令(在这里find)添加新的证书套接字与appid和certhash(没有空格),你使用这个命令

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

你应该得到:

SSL Certificate successfully added

DONE。 您刚刚取代了绑定到此IP +端口(套接字)的所有网站的证书。