簡體   English   中英

調用Bindings.Remove不會從HTTP.sys中刪除SSL證書

[英]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.ChangingRoleEnvironment.Changed事件,但不幸的是,當調用這些事件時尚未創建綁定,因此沒有明顯的地方可以使用netsh http delete sslcert刪除綁定碼。

我不知道這是一個“答案”。 這意味着我仍有一個問題,即為RDP配置Azure實例或更改證書配置會破壞我的SNI綁定。 對於我的組織,這是可以的,因為只有幾個人具有足夠的權限來配置RDP,並且如果他們需要使用RDP,他們可以接受培訓以明確刪除新綁定。 如果我找到一種完全防止這種情況的方法,我會在這里跟進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM