2016-05-04 7 views
1

Самая короткая версия моего вопроса заключается в том, что вызов ServerManager.Binding.Remove, кажется, удаляет привязку из IIS, но все равно оставляет его в HTTP.sys или везде, где установлены привязки SSL и разрывы слоев моего кода дальше.Calling Bindings.Remove не удаляет SSL-сертификат из HTTP.sys

У меня работает служба облачного облака, которая должна использовать SNI для поддержки нескольких имен хостов с использованием SSL. Фактически то, что я делаю, в 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 Binding удаляется из списка привязок IIS, но он по-прежнему отображается в списке SSL привязок, когда я звоню netsh http show sslcert.

Так, например, вот результат вызова Get-WebBinding в Powershell. Обратите внимание на то, что 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 
... 

Почему бы Связывание SSL-сертификата все еще существует, если я успешно удалю привязку из IIS с помощью ServerManager?

ответ

0

Оказывается, что настройка роли для удаленного рабочего стола с Azure Portal заключалась в добавлении привязки. В частности, причиной этого является обновление конфигурации сертификата для роли (которая происходит как часть конфигурации RDP). Это означало, что это сработало, пока я не пошел через RDP, чтобы проверить, работает ли он, в какой момент он начнет терпеть неудачу. Конечно, гений, которым я являюсь, я пытался быть методичным и делать все в одном и том же порядке каждый раз, а это значит, что я настраивал удаленный рабочий стол, прежде чем пытаться выполнить запрос, поэтому с моей точки зрения это выглядело так, как будто это сработало с самого начала. Только когда я попытался сделать что-то противоположное (выполнив запросы перед настройкой RDP), он начал работать.

Вы можете использовать netsh http delete sslcert, чтобы удалить привязку, и это не влияет на возможность входа в систему через RDP к этому экземпляру.

При настройке протокола RDP он называет RoleEnvironment.Changing и RoleEnvironment.Changed события, но, к сожалению, когда эти события называется связывание не было созданы еще, так что это не очевидное место, где вы могли бы использовать netsh http delete sslcert для удаления привязки в коде.

Я не знаю, что это «ответ» точно. Это означает, что у меня все еще есть проблема, когда настройка Azure Instance для RDP или изменение конфигурации сертификата прерывает мои привязки SNI. Для моей организации это нормально, потому что есть только несколько человек с достаточными разрешениями для настройки RDP, и их можно обучить явным удалением новой привязки, если им нужно использовать RDP. Я буду следить за этим, если я выясню способ предотвратить это вообще.