WedX - журнал о программировании и компьютерных науках

Установите SSL-сертификат программно с помощью Microsoft.Web.Administration.

Поэтому API Microsoft.Web.Administration очень легко использовать для создания привязок HTTP и HTTPS к сайтам:

using (ServerManager manager = new ServerManager())
{
    Site site = manager.Sites[siteName];
    site.Bindings.Clear();
    site.Bindings.Add("*:80:", "http");
    site.Bindings.Add("*:443:", "https");

    manager.CommitChanges();
}

Но привязка HTTPS довольно бессмысленна без SSL-сертификата. Как я могу программно выбрать файл сертификата и использовать его с привязкой HTTPS, используя этот API?

22.02.2011

  • Принятый ответ не является качественным ответом. Ему не хватает кода, и он говорит вам искать где-нибудь еще. это ближе к комментарию, чем к ответу. Я думаю, вам следует рассмотреть возможность принятия другого ответа. 15.04.2018

Ответы:


1

Существует перегрузка метода для добавления привязок, которая правильно добавит сертификат в HTTP.sys, см.: https://msdn.microsoft.com/en-us/library/bb355650(v=VS.90).aspx

При желании вы можете установить параметры привязки:

binding.CertificateHash и binding.CertificateStoreName, и при фиксации он будет правильно регистрироваться в HTTP.sys: https://msdn.microsoft.com/en-us/library/microsoft.web.administration.binding_properties(v=VS.90).aspx

01.03.2011
  • Я знаю, что это старый вопрос, но я заметил, что если я устанавливаю значения CertificateHash и CertificateStoreName для привязки и вызываю CommitChanges, все якобы удается, но привязка не установлена. Не уверен, почему это происходит. 06.12.2016
  • @Fizz: мне пришлось вручную установить binding.BindingInformation = binding.BindingInformation; (хотя это выглядит бессмысленно, это приводит к тому, что IIS фактически привязывает сертификат). 24.04.2018
  • @Devator понял, почему это работает? Это также сработало для меня, хотя вы правы, это не имеет смысла. 09.05.2018
  • ВАЖНО: как отметил @Fizz, вам необходимо вручную установить BindingInformation обратно на себя, чтобы фактически установить CertificateHash и CertificateStoreName (среди других свойств). Это кажется мне ошибкой и сводило меня с ума, пока я не понял, что Физз говорил нам делать. 26.11.2018
  • Я попытался это сделать и получил HRESULT 0x80070520 Указанный сеанс входа в систему не существует. Возможно, оно было прекращено. 06.02.2020
  • @ThomasHarris Вы исправили это? Я иногда получаю это сообщение... иногда нет... :/ 21.02.2020
  • Нет, я сдался и просто использовал обычный http для локальных подключений, использовал win-acme для получения сертификата ssl для внешних подключений к IIS. 09.03.2020

  • 2

    Метод Bindings.Add() имеет перегрузку для передачи SSL-сертификата. Если у вас уже есть сертификат SSL, вы можете выбрать его в хранилище сертификатов SSL следующим образом:

    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    store.Open(OpenFlags.OpenExistingOnly);
    var certificate = store.Certificates.Find(X509FindType.FindByThumbprint, the thumbprint for the key", true);
    
    var site = _mgr.Sites[name];
    site.Bindings.Add("*:4043:", certificate[0].GetCertHash(), "MY");
    

    После того, как вы запустите код, вы можете проверить, что он работает, запустив его из командной строки:

    netsh http show sslcert
    
    12.12.2011

    3

    Поскольку ответ Helephant является лучшим, если вам нужны хэши сертификатов (т.е. несколько IP-адресов на одном компьютере с различными сертификатами SSL), вам нужно знать, как получить сертификаты/хэши. Несколько строк ниже демонстрируют, как найти информацию, поскольку документация MSDN очень скудна для этой темы.

    Вы не можете удаленно обновить привязку SSL с помощью ServerManager.OpenRemote() — похоже, в этом есть ошибка. Appcmd вам тоже не поможет.

    Если вы хотите преобразовать строку байтов обратно в массив байтов (если вы знаете хэш), вот как.

    static void Main(string[] args)
    {
        var store2 = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
        Console.WriteLine("TrustedPublisher:");
        PrintCerts(store2);
        Console.WriteLine(); 
    
        Console.WriteLine("MY:");
        store2 = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        PrintCerts(store2);
        Console.WriteLine();
    
        Console.WriteLine("CertificateAuthority:");
        store2 = new X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine);
        PrintCerts(store2);
        Console.WriteLine();
    }
    
    static string PrintHash(byte[] cert)
    {
        StringBuilder builder = new StringBuilder();
    
        foreach (byte b in cert)
        {
            builder.AppendFormat("{0:x2}", b);
        }
    
        return builder.ToString();
    }
    
    static void PrintCerts(X509Store store)
    {
        store.Open(OpenFlags.OpenExistingOnly);
        foreach (var cert in store.Certificates)
        {
            Console.Write("{0} - {1}", cert.FriendlyName, PrintHash(cert.GetCertHash()));
            Console.WriteLine();
        }
    }
    

    Пример вывода:

    МОЙ:
    www.awesomesite.com - cc2b5fc8216a949b58aadc21089c12b2c090f6bd

    09.02.2012

    4

    Пространство имен не содержит API для этого, поэтому вы должны использовать его ConfigurationMethod для вызова расширения Win API, которое выполняет эту функцию. Что-то типа:

    string certificateHash = <hash>
    string certificateStore = <storename>  #my, localmachine, etc
    
    ConfigurationMethod method = binding.Methods["AddSslCertificate"];
    ConfigurationMethodInstance mi = method.CreateInstance();
    mi.Input.SetAttributeValue("certificateHash", certificateHash);
    mi.Input.SetAttributeValue("certificateStoreName", certificateStore);
    mi.Execute();
    
    28.02.2011
  • На самом деле выяснилось, что API справляется с этим. См. здесь: msdn.microsoft.com/en-us/ библиотека/bb355650(VS.90).aspx 03.03.2011
  • Похоже, у CarlosAg есть ссылка в его ответе. 03.03.2011
  • Сейчас в 2020 работает с IIS v10. Моя большая ошибка, 3 дня на помойку, очень важно понимать mi.Input.SetAttributeValue(certificateStoreName, certificateStore); Когда я делаю это сам, если указать в certificateStoreName имя сертификата, это моя большая ошибка. Правильное имя STORE, а не имя сертификата. 17.07.2020

  • 5

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

    Если вы зададите информацию о привязке для самого себя, это приведет к тому, что IIS привяжет сертификат. Краткий пример показан ниже:

    binding.BindingInformation = binding.BindingInformation;

    21.02.2020

    6

    Добавление к комментарию Тейлора Берда, но с использованием powershell:

        ...
    Write-Verbose ("Remove old certificate [ {0} ]... " -f $SiteHttpsBinding.GetAttributeValue("certificateHash"))
    $BindingMethod=$SiteHttpsBindings.Methods["RemoveSslCertificate"]
    $BindingMethodInstance=$BindingMethod.CreateInstance()
    $BindingMethodInstance.Execute()
    Write-Verbose ("Add new certificate [ {0} ]..." -f $AfterThumbprint)
    $BindingMethod=$SiteHttpsBindings.Methods["AddSslCertificate"]
    $BindingMethodInstance=$BindingMethod.CreateInstance()
    $BindingMethodInstance.Input.SetAttributeValue("certificateHash", $AfterThumbprint)
    $BindingMethodInstance.Input.SetAttributeValue("certificateStoreName", "My")
    $BindingMethodInstance.Execute()
    ...
    

    Приведенный выше фрагмент кода полезен для обновления сертификатов без необходимости удаления всей привязки. Я использовал его для добавления и обновления привязок ssl на локальных и удаленных машинах.

    Благодарим г-на Берда за предоставление ссылки на WinAPI.

    14.12.2015

    7

    Если вы попали сюда и хотите использовать PowerShell для достижения этой цели, я дал довольно полный ответ здесь. Самый простой ответ, если вы знаете хэш сертификата, который хотите использовать, это сделать так:

    cd IIS:\SslBindings
    get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95 | New-Item 0.0.0.0!443
    
    17.02.2016
    Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]