我的問題的最短版本是調用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綁定仍然存在?