[英]Calling Bindings.Remove does not remove SSL cert from HTTP.sys
我的問題的最短版本是調用ServerManager.Binding.Remove
似乎從IIS中刪除綁定,但仍然將其保留在HTTP.sys或設置SSL綁定的任何地方,並進一步打破我的代碼層。
我正在運行一個Azure雲服務,需要使用SNI來支持使用SSL的多個主機名。 有效地我在做什么是處理通信去掉默認使用綁定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綁定列表中刪除,但當我調用netsh http show sslcert
時它仍然顯示在SSL綁定列表中。
因此,例如,這是在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.Changing
和RoleEnvironment.Changed
事件,但不幸的是,當調用這些事件時尚未創建綁定,因此沒有明顯的地方可以使用netsh http delete sslcert
刪除綁定碼。
我不知道這是一個“答案”。 這意味着我仍有一個問題,即為RDP配置Azure實例或更改證書配置會破壞我的SNI綁定。 對於我的組織,這是可以的,因為只有幾個人具有足夠的權限來配置RDP,並且如果他們需要使用RDP,他們可以接受培訓以明確刪除新綁定。 如果我找到一種完全防止這種情況的方法,我會在這里跟進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.