2012-02-03 9 views
10

Мне нужно программно добавить сайт IIS 7.x, и я застрял, когда это должно быть создано с привязкой HTTPS/SSL по умолчанию, usig SiteCollection.Add(string, string, string, byte[]) overload.IIS 7.x, добавляющий сайт с поддержкой HTTPS: SiteCollection.Add (строка, строка, строка, байт []) перегрузка

Предоставление https:*:80:test.localhost https:*:443:test.localhost в bindingInformation бросает ArgumentException с этим сообщением: Указанный HTTPS связывание является недействительным.

Что не так в этой обязательной информации?

спасибо.

EDIT: Я использую сборку Microsoft.Web.Administration.

+0

Неправильный порт (443)? Отсутствует сертификат? – CodeZombie

+0

@ ZombieHunter Нет отсутствующего сертификата, я правильно загружаю его, у меня есть массив байтов. Порт ... Мммм, хорошая точка хахаха –

+0

@ZombieHunter Не повезло, это не порт. –

ответ

15

Вот что я сделал, чтобы создать сайт https, и это сработало. Конечно, я пропущу некоторые части кода.

using Microsoft.Web.Administration 
... 
using(var manager = new ServerManager()) 
{ 
    // variables are set in advance... 
    var site = manager.Sites.Add(siteName, siteFolder, siteConfig.Port); 

    var store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); 

    // certHash is my certificate's hash, byte[] 
    var binding = site.Bindings.Add("*:443:", certHash, store.Name); 
    binding.Protocol = "https"; 

    store.Close(); 

    site.ApplicationDefaults.EnabledProtocols = "http,https"; 

    manager.CommitChanges(); 
} 

UPD: сертификат создается из файла PFX следующим образом:

// get certificate from the file 
string pfx = Directory.GetFiles(folder, "*.pfx", SearchOption.AllDirectories).FirstOrDefault(); 
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); 

var certificate = new X509Certificate2(pfx, certPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); 
store.Add(certificate); 
store.Close(); 
certHash = certificate.GetCertHash(); 
+0

Кажется, это путь, но когда я совершаю изменения, он выдает исключение UnauthorizedAccessException и описания нет. Вы тоже столкнулись с этой проблемой? –

+0

Для администрирования iis и работы с хранилищем сертификатов auth необходимо иметь административные разрешения. – ElDog

+0

Это не лучшая серебряная пуля, но вы дали мне хороший намек, и теперь все хорошо. Большое спасибо! –

1

Насколько я могу видеть BindingInformation без протокола:

Значение этого свойства представляет собой строку двоеточиями, которая включает в себя на IP-адрес, порт и имя хоста связывания.

Источник: http://msdn.microsoft.com/en-us/library/microsoft.web.administration.binding.bindinginformation%28v=vs.90%29.aspx

Существует также перегрузка, которая принимает параметр BindingProtocol:

public Site Add(
    string name, 
    string bindingProtocol, 
    string bindingInformation, 
    string physicalPath 
) 

Источник: http://msdn.microsoft.com/en-us/library/bb359364%28v=vs.90%29.aspx

Может быть, вы должны использовать Binding объект, предлагаемый сайт instance as предлагает больше настроек, чем экземпляр SiteCollection.

+0

Спасибо за ваши усилия. Кстати, я дал ссылку на документ перегрузки в MSDN, и если вы отметите ** примечания **, вы найдете этот протокол перегрузки в протоколе привязки. На втором месте я попытался сделать другой способ, как ваше предложение, с таким же эффектом. –

+0

NP. Рад, что вы нашли рабочее решение :-) – CodeZombie