Автоматизируйте установку SSL-сертификата на сайты IIS 6 с помощью C#

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

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

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

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

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


person Rojzik    schedule 13.10.2011    source источник
comment
Если вы хотите установить его в хранилище, используемом IIS, см. раздел Программная установка SSL-сертификата с помощью Microsoft.Web.Administration.   -  person jww    schedule 15.04.2018


Ответы (3)


См. это: 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();
}
person Rami A.    schedule 21.02.2012
comment
Хм, кажется, это решение для IIS7 или выше, а не для IIS6. Пространство имен Microsoft.Web.Administration недоступно для IIS6. См. эту ссылку... stackoverflow.com/questions/2164885/ - person barrypicker; 13.06.2013

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

Шаги...

  1. Добавить ссылку на COM-компонент IIS CertObj 1.0 Type Library
  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 был пропущен. Убедитесь, что эталонный объект НЕ встроен.

person barrypicker    schedule 17.07.2013

Чтобы сделать это с .Net 4.7 и IIS 10, вы можете передать следующие флаги:

X509Certificate2 certificate = new X509Certificate2(path, "password", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable| X509KeyStorageFlags.MachineKeySet);

Если вы храните сертификат в хранилище CurrentUser, а не в хранилище LocalMachine, выполните следующие действия:

X509Certificate2 certificate = new X509Certificate2(path, "password", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable| X509KeyStorageFlags.UserKeySet);

Флаги набора ключей указывают на следующее:

//
// Summary:
//     Private keys are stored in the current user store rather than the local computer
//     store. This occurs even if the certificate specifies that the keys should go
//     in the local computer store.
UserKeySet = 1,
//
// Summary:
//     Private keys are stored in the local computer store rather than the current user
//     store.
MachineKeySet = 2,

Закрытый ключ должен находиться в том же месте, что и остальная часть сертификата, чтобы он работал с IIS.

person Roberto Bonini    schedule 05.08.2019