2016-05-04 44 views
1

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

回答

0

原來,從Azure門戶配置遠程桌面的角色是添加綁定。更具體地說,更新角色的證書配置(作爲RDP配置的一部分發生)正在導致它。這意味着它的工作,直到我通過RDP進入,以檢查它是否正在工作,在哪一點,它會開始失敗。當然,我是一個天才,我試圖變得有條不紊,每次都按照相同的順序進行操作,這意味着我在實際嘗試請求之前配置了遠程桌面,所以從我的角度來看,它似乎從一開始就失敗了。只有當我嘗試了相反的事情(在配置RDP之前運行請求)纔開始工作。

您可以使用netsh http delete sslcert刪除綁定,並且不會影響您通過RDP登錄到該實例的能力。

當您配置RDP它調用RoleEnvironment.ChangingRoleEnvironment.Changed事件,但不幸的是,當這些事件被稱爲約束力尚未建立,所以沒有在那裏你可以使用netsh http delete sslcert刪除代碼中的結合的顯着位置。

我不知道這完全是一個「答案」。這意味着我仍然有一個問題,即爲RDP配置Azure實例或更改證書配置會破壞我的SNI綁定。對於我的組織來說,這是可以的,因爲只有幾個人有足夠的權限來配置RDP,並且他們可以接受培訓,以在他們需要使用RDP時顯式刪除新綁定。如果我想辦法完全防止這種情況,我會在這裏跟進。