【问题标题】:Calling Bindings.Remove does not remove SSL cert from HTTP.sys调用 Bindings.Remove 不会从 HTTP.sys 中删除 SSL 证书
【发布时间】:2016-08-30 10:16:35
【问题描述】:

我的问题的最短版本是,调用 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 ssl iis azure-cloud-services sni


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 2016-09-30
      • 2017-05-02
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多