Автоматизировать установку SSL-сертификата на сайты IIS 6 с помощью C # - PullRequest
0 голосов
/ 13 октября 2011

Я пытаюсь автоматизировать процесс создания сайта в IIS 6 с помощью кода C #.Я использую DirectoryServices, и я почти на месте ... У меня есть его создание сайта, настройка всех привязок и т. Д. Просто отлично.Я не понял, как установить наш подстановочный сертификат ssl.Вот подробности:

У нас есть сертификат SSL, который соответствует * .example.com.Каждый сайт, который мы размещаем, имеет привязку к серверу, которая соответствует.например, «test.example.com».Я думаю, что знаю, как добавить свойство SecureBinding:

DirectoryEntrySite.Properties["SecureBindings"][0] = "xx.xx.xx.xx:443:test.example.com";

Но мне не удалось найти информацию о том, как автоматически установить сертификат на сайт.В диспетчере IIS 6 это можно сделать, щелкнув правой кнопкой мыши сайт -> свойства -> Безопасность каталога -> Сертификат сервера -> Далее -> Назначить существующий сертификат -> (выбрать сертификат) -> Далее ...

Может кто-нибудь помочь?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

См. Это: http://forums.iis.net/t/1163325.aspx

using Microsoft.Web.Administration;  

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

X509Certificate2 certificate = new X509Certificate2(pfxFilePath);

store.Add(certificate);

using (ServerManager serverManager = new ServerManager())
{
    Site site = serverManager.Sites["Default Web Site"];

    if (site != null)
    {
         site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name);
    }

    store.Close();
}
1 голос
/ 18 июля 2013

ОК, на этот вопрос уже дан ответ, но присужденный ответ не для IIS6, а скорее для IIS7 и выше. Пространство имен Microsoft.Web.Administration недоступно для IIS6. Мы объединили ряд технологий, все в .NET 4.0, чтобы заставить это работать.

шаги ...

  1. Добавить ссылку на COM-компонент IIS CertObj 1.0 Библиотека типов
  2. На добавленной ссылке CERTOBJLib в окне свойств установите 'Внедрить типы взаимодействия' в false
  3. Создать класс с помощью следующего метода ...

using System.Linq;
using System.Management;
namespace CertStuff
{
    public class CertificateInstaller
    {
public void RegisterCertificateWithIIS6(string webSiteName, string certificateFilePath, string certificatePassword)
        {
            // USE WMI TO DERIVE THE INSTANCE NAME
            ManagementScope managementScope = new ManagementScope(@"\\.\root\MicrosoftIISv2");
            managementScope.Connect();
            ObjectQuery queryObject = new ObjectQuery("SELECT Name FROM IISWebServerSetting WHERE ServerComment = '" + webSiteName + "'");
            ManagementObjectSearcher searchObject = new ManagementObjectSearcher(managementScope, queryObject);
            var instanceNameCollection = searchObject.Get();
            var instanceName = (from i in instanceNameCollection.Cast<ManagementObject>() select i).FirstOrDefault();

            // USE IIS CERT OBJ TO IMPORT CERT - THIS IS A COM OBJECT
            var IISCertObj = new CERTOBJLib.IISCertObjClass();
            IISCertObj.InstanceName = instanceName["Name"].ToString();
            IISCertObj.Import(certificateFilePath, certificatePassword, false, true); // OVERWRITE EXISTING
        }

    }
}

чтобы удалить ссылку на сертификат, используйте следующий метод ...

public void UnRegisterCertificateWithIIS6(string webSiteName)
        {
            // USE WMI TO DERIVE THE INSTANCE NAME
            ManagementScope managementScope = new ManagementScope(@"\\.\root\MicrosoftIISv2");
            managementScope.Connect();
            ObjectQuery queryObject = new ObjectQuery("SELECT Name FROM IISWebServerSetting WHERE ServerComment = '" + webSiteName + "'");
            ManagementObjectSearcher searchObject = new ManagementObjectSearcher(managementScope, queryObject);

            foreach (var instanceName in searchObject.Get())
            {
                var IISCertObj = new CERTOBJLib.IISCertObjClass();
                IISCertObj.InstanceName = instanceName["Name"].ToString();

                // THE REMOVE CERT CALL COMPLETES SUCCESSFULLY, BUT FOR WHATEVER REASON, IT ERRORS OUT.
                // SWALLOW THE ERROR.
                try
                {
                    IISCertObj.RemoveCert(false, true);
                }
                catch (Exception ex)
                {

                }
            }
        }

ПРИМЕЧАНИЕ: , если вы получаете сообщение об ошибке «Невозможно внедрить тип взаимодействия« CERTOBJLib.IISCertObjClass ». Вместо этого используйте соответствующий интерфейс.», Это означает, что шаг 2 был пропущен. Убедитесь, что эталонный объект НЕ внедрен.

...