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

问题描述:

我的问题的最短版本是调用ServerManager.Binding.Remove似乎从IIS删除绑定,但仍将其保留在HTTP.sys中或设置了SSL绑定并断开我的代码层进一步下降。调用Bindings.Remove不会从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:端口绑定从IIS绑定列表中删除,但仍显示在SSL绑定列表当我打电话netsh http show sslcert

因此,例如,以下是Powershell中调用Get-WebBinding的输出。请注意,默认IP:端口绑定是不是有:

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 Cert绑定仍然存在?

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

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

当您配置RDP它调用RoleEnvironment.ChangingRoleEnvironment.Changed事件,但不幸的是,当这些事件被称为约束力尚未建立,所以没有在那里你可以使用netsh http delete sslcert删除代码中的结合的显着位置。

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