Установить сертификат SSL программно, используя Microsoft.Web.Administration - PullRequest
12 голосов
/ 22 февраля 2011

Таким образом, 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?

Ответы [ 6 ]

7 голосов
/ 01 марта 2011

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

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

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

6 голосов
/ 09 февраля 2012

Поскольку ответ 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();
    }
}

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

MY:
www.awesomesite.com - cc2b5fc8216a949b58aadc21089c12b2c090f6bd

6 голосов
/ 12 декабря 2011

Метод 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
1 голос
/ 28 февраля 2011

Пространство имен не содержит 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();
0 голосов
/ 17 февраля 2016

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

cd IIS:\SslBindings
get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95 | New-Item 0.0.0.0!443
0 голосов
/ 14 декабря 2015

Добавление к комментарию Тейлора Берда, но с использованием 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...