调用 Bindings.Remove 不会从 HTTP.sys 中删除 SSL 证书

Calling Bindings.Remove does not remove SSL cert from HTTP.sys

我的问题的最短版本是调用 ServerManager.Binding.Remove 似乎从 IIS 中删除了绑定,但仍将其保留在 HTTP.sys 或设置 SSL 绑定的任何地方并进一步破坏了我的代码层下来。

我正在 运行 需要使用 SNI 来支持使用 SSL 的多个主机名的 Azure 云服务。实际上,我正在做的是在 OnStart 中使用 ServerManager.Binding.Remove(binding) 删除默认绑定并使用 ServerManager.Binding.Add(binding) 添加我自己的绑定。例如:

ServerManager serverManager = new ServerManager();
Site site = serverManager.Sites[0];

// Add my site bindings.
foreach (string host in listOfHostsToBind)
{
    X509Certificate2 cert = LookupCertificate(host.sslThumbprint);
    var binding = site.Bindings.Add(":443:" + host, cert.GetCertHash(), "My");
    binding.SetAttributeValue("sslFlags", 1);  //Set SNI flag
}

// Remove the default binding
var bindingsToRemove = new List<Binding>();
foreach (Binding binding in site.Bindings)
{
     if (binding.Protocol == "https" && Convert.ToInt64(binding.Attributes["sslFlags"].Value) != 1)
     {
         bindingsToRemove.Add(binding);
     }
}

foreach (Binding binding in bindingsToRemove)
{
    site.Bindings.Remove(binding);
    serverManager.CommitChanges();
}

serverManager.CommitChanges();

最终发生的是默认 IP:Port 绑定从 IIS 绑定列表中删除,但当我调用 netsh http show sslcert 时它仍然显示在 SSL 绑定列表中。

因此,例如,这是在 Powershell 中调用 Get-WebBinding 的输出。请注意默认的 IP:Port 绑定不存在:

protocol     bindingInformation                       sslFlags
--------     ------------------                       --------
http         10.20.30.40:80:                          0
https        :443:myfirstaddedhost.com                1
https        :443:mysecondaddedhost.com               1

看起来不错,但它仍然不起作用,因为如果我 运行 netsh http show sslcert 我得到以下内容:

IP:port                      : 10.20.30.40:443
Certificate Hash             : xxx
Application ID               : {00000000-0000-0000-0000-000000000000}
Certificate Store Name       : MY
...

Hostname:port                : myfirstaddedhost.com:443
Certificate Hash             : xxx
Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name       : My
...

Hostname:port                : mysecondaddedhost.com:443
Certificate Hash             : xxx
Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name       : My
...

如果我使用 ServerManager 从 IIS 中成功删除了绑定,为什么 SSL 证书绑定仍然存在?

事实证明,从 Azure 门户为远程桌面配置角色是在添加绑定。更具体地说,更新角色的证书配置(作为 RDP 配置的一部分发生)是导致它的原因。这意味着它一直有效,直到我通过 RDP 进入以检查它是否正常工作,此时它会开始失败。当然,我是个天才,我试图保持有条不紊,每次都按照相同的顺序做事,这意味着我在实际尝试请求之前配置远程桌面,所以从我的角度来看,它似乎从一开始就失败了。只有当我尝试相反的事情时(运行 在配置 RDP 之前请求)它才开始工作。

您可以使用 netsh http delete sslcert 删除绑定,这不会影响您通过 RDP 登录到该实例的能力。

当您配置 RDP 时,它会调用 RoleEnvironment.ChangingRoleEnvironment.Changed 事件,但不幸的是,当调用这些事件时,绑定尚未创建,因此没有明显的地方可以使用netsh http delete sslcert删除代码中的绑定。

我不知道这是 "answer"。这意味着我仍然遇到为 RDP 配置 Azure 实例或更改证书配置会破坏我的 SNI 绑定的问题。对于我的组织来说,这没问题,因为只有几个人有足够的权限来配置 RDP,并且可以训练他们在需要使用 RDP 时显式删除新绑定。如果我想出一种完全防止这种情况的方法,我会在这里跟进。