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

Azure 调用Bindings.Remove不会从HTTP.sys中删除SSL证书,azure,ssl,iis,azure-cloud-services,sni,Azure,Ssl,Iis,Azure Cloud Services,Sni,我的问题的最简短版本是调用ServerManager.Binding.Remove似乎可以从IIS中删除绑定,但仍然将其保留在HTTP.sys或设置SSL绑定的任何地方,并进一步分解代码层 我正在运行一个Azure云服务,它需要使用SNI来支持使用SSL的多个主机名。实际上,我所做的是在OnStart中使用ServerManager.binding.Remove(binding)删除默认绑定,并使用ServerManager.binding.Add(binding)添加我自己的绑定。例如: Se

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

我正在运行一个Azure云服务,它需要使用SNI来支持使用SSL的多个主机名。实际上,我所做的是在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();
看起来不错,但仍然不起作用,因为如果我运行
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.Changing
RoleEnvironment.Changed
事件,但不幸的是,当这些事件被调用时,尚未创建绑定,因此没有明显的位置可以使用
netsh http delete sslcert
删除代码中的绑定


我不知道这是一个确切的“答案”。这意味着我仍然存在为RDP配置Azure实例或更改cert配置会破坏我的SNI绑定的问题。对于我的组织来说,这是可以的,因为只有几个人有足够的权限来配置RDP,如果他们需要使用RDP,可以培训他们显式删除新绑定。如果我想办法完全防止这种情况发生,我将在这里继续讨论。

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

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

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

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

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
...