【发布时间】: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