Contents of this directory is archived and no longer updated.

В заключительной части этой беседы мы поговорим об удалении и создании конфигураций отзыва для Online Responder.

Если так случилось, что вам какая-то конфигурация надоела или показалась скучной, вы её можете удалить. Удаляются они при помощи метода DeleteCAConfiguration:

PS C:\> $OCSPAdmin = New-Object -ComObject CertAdm.OCSPAdmin
PS C:\> $OCSPAdmin.GetConfiguration("dc2",$true)
PS C:\> $OCSPAdmin.OCSPCAConfigurationCollection | %{$_.Identifier}
ocsp
PS C:\> $OCSPAdmin.OCSPCAConfigurationCollection.DeleteCAConfiguration("ocsp")
PS C:\> $OCSPAdmin.SetConfiguration("dc2",$true)
PS C:\>

В качестве аргумента указываем название конфигурации (свойство Identifier). И ещё раз напоминаю, что любые изменения необходимо завершать вызовом метода SetConfiguration.

Когда мы избавились от неугодных конфигураций, мы можем создать какую-нибудь нескучную конфигурацию. И вот что нам потребуется заполнять, в зависимости от сценария использования.

Если мы создаём конфигурацию для Enterprise CA:

  1. название новой конфигурации;
  2. сертификат CA;
  3. адрес CA, у которого запрашивать сертификат (адрес указывается в формате: CaHostName\CAName);
  4. шаблон сертификатов, на основе которого будет запрашиваться сертификат подписи;
  5. флаги подписи и энроллмента сертификата подписи;
  6. ссылки на CRL'ы.

Подразумевается, что вы настроили права на шаблон и права на закрытый ключ (Network Service — Allow Read).

Если мы создаём конфигурацию для Standalone CA и/или для CA, который не является членом текущего леса Active Directory:

  1. название новой конфигурации;
  2. сертификат CA;
  3. Флаги подписи;
  4. сертификат подписи;
  5. ссылки на CRL'ы.

В этом случае вы самостоятельно должны доставить сертификат подписи в хранилище сертификатов и назначить права на чтение закрытого ключа для Network Service.

Новая конфигурация создаётся при помощи метода CreateCAConfiguration:

PS C:\> ipmo pspki
PS C:\> $cert = (Get-CA dc2*).Certificate
PS C:\> $cert

Thumbprint                                Subject
----------                                -------
E45ACBB4417260A622C9C45F4322C377A98BEC9D  CN=contoso-DC2-CA, DC=contoso, DC=com


PS C:\> $Config = $OCSPAdmin.OCSPCAConfigurationCollection.CreateCAConfiguration("Нескучная конфигурация для contoso-dc2
-ca",$cert.RawData)
PS C:\> $config


Identifier                 : Нескучная конфигурация для contoso-dc2-ca
CACertificate              : {48, 130, 4, 78...}
HashAlgorithm              :
SigningFlags               :
SigningCertificate         :
ReminderDuration           :
ErrorCode                  : 2147483658
CSPName                    :
KeySpec                    :
ProviderCLSID              :
ProviderProperties         :
Modified                   : True
LocalRevocationInformation :
SigningCertificateTemplate :
CAConfig                   :



PS C:\>

Примечание: командлеты Get-CA и Get-ErrorMessage (ниже) доступны только при использовании моего пошпки модуля: http://pspki.codeplex.com/

Как видите, у нас тут толком ничего нету, кроме названия, сертификата CA и ErrorCode. Но ничего страшного, потому что:

PS C:\> "{0:x2}" -f 2147483658
8000000a
PS C:\> Get-ErrorMessage 0x8000000a
The data necessary to complete this operation is not yet available.
PS C:\>

Код указывает нам, что кое какой информации не хватает. Итак, начинаем заполнять свойства. Но, прежде, надо разобраться со свойством SigningFlags. Оно представляет собой сумму комбинаций, которые перечислены здесь: IOCSPCAConfiguration::SigningFlags property. Заранее скажу, что для Enterprise CA нам необходимы следующие флаги:

  • OCSP_SF_ALLOW_SIGNINGCERT_AUTOENROLLMENT — позволяет автоматически запрашивать сертификат подписи, когда предыдущий начнёт истекать;
  • OCSP_SF_RESPONDER_ID_KEYHASH — Online Responder будет себя идентифицировать по KeyID (хешу открытого ключа сертификата CA), а не по имени;
  • OCSP_SF_AUTODISCOVER_SIGNINGCERT — Online Responder будет автоматически выбирать сертификат подписи из хранилища;
  • OCSP_SF_FORCE_SIGNINGCERT_ISSUER_ISCA — сервер сертификации должен подписать сертификат подписи (т.е. не самоподписанный);
  • OCSP_SF_ALLOW_SIGNINGCERT_AUTORENEWAL — Online Responder будет автоматически назначать обновлённый сертификат подписи;
  • OCSP_SF_SILENT — всё должно проходить тихо, без пыли, без дыма и шума.

Если все эти флажки сложить, то должно получиться что-то вроде 605 или около того. Так и запишем:

PS C:\> $Config.SigningFlags = 605
PS C:\> # указываем алгоритм хеширования и подписи
PS C:\> $Config.HashAlgorithm = "SHA1"
PS C:\> # указываем по истечении какого времени необходимо обновлять сертификат подписи. По умолчанию - 90%
PS C:\> $Config.ReminderDuration = 90
PS C:\> # указываем GUID провайдера отзыва:
PS C:\> $Config.ProviderCLSID = "{4956d17f-88fd-4198-b287-1e6e65883b19}"
PS C:\> # указываем адрес сервера CA, у которого будем получать сертификаты подписи:
PS C:\> $Config.CAConfig = "dc2.contoso.com\contoso-dc2-ca"
PS C:\> $Config.SigningCertificateTemplate = "OCSPResponseSigning"
PS C:\> $Config


Identifier                 : Нескучная конфигурация для contoso-dc2-ca
CACertificate              : {48, 130, 4, 78...}
HashAlgorithm              : SHA1
SigningFlags               : 605
SigningCertificate         :
ReminderDuration           : 90
ErrorCode                  : 2147483658
CSPName                    :
KeySpec                    :
ProviderCLSID              : {4956d17f-88fd-4198-b287-1e6e65883b19}
ProviderProperties         :
Modified                   : True
LocalRevocationInformation :
SigningCertificateTemplate : OCSPResponseSigning
CAConfig                   : dc2.contoso.com\contoso-dc2-ca



PS C:\>

Примечание: в теории, Microsoft Online Responder может поддерживать различные типы провайдеров отзыва. Например, как-то лазить в БД самого CA и оттуда извлекать информацию о статусе запрашиваемого сертификата (например, как это делает Tumbleweed OCSP Responder). Поэтому каждому типу провайдера назначется уникальный GUID. На практике я не очень представляю, как это можно расширить и мы будем использовать CRL-based провайдер. И для него GUID всегда должен быть 4956d17f-88fd-4198-b287-1e6e65883b19.

CSP и KeySpec указывать не надо, потому что эта информация хранится в шаблоне сертификата. Теперь нам надо нстроить провайдер отзыва. По большому счёту, достаточно указать только ссылки на Base и Delta (если надо) CRL. Конфигурация отзыва создаётся при помощи интерфейса IOCSPPropertyCollection:

$OCSPPropCollection = New-Object -ComObject CertAdm.OCSPPropertyCollection
[void]$OCSPPropCollection.InitializeFromProperties($null)
# для получения ссылок на BaseCRL можно использовать ICertAdmin и CR_PROP_CERTCDPURLS (0x29)
$CertAdmin = New-Object -ComObject CertificateAuthority.Admin
$BaseCRLURLs = $CertAdmin.GetCAProperty("dc2\contoso-dc2-ca",0x29,0,4,0).split("`n", [StringSplitOptions]::RemoveEmptyEntries)
[void]$OCSPPropCollection.CreateProperty("BaseCrlUrls",[String[]]$BaseCRLURLs)
# ссылки на DeltaCRL надо вбивать/преобразовывать вручную.
$DeltaCRLURLs = $BaseCRLURLs | %{
    if ($_ -match "^http") {
        $_ -replace "\.crl$", "+.crl"
    } else {
        $_ -replace "\?certificateRevocationList\?","?deltaRevocationList?"
    }
}
[void]$OCSPPropCollection.CreateProperty("DeltaCrlUrls",[String[]]$DeltaCRLURLs)
# записываем свойства провайдера отзыва в нашу конфигурацию
$Config.ProviderProperties = $OCSPPropCollection.GetAllProperties()
PS C:\> $Config


Identifier                 : Нескучная конфигурация для contoso-dc2-ca
CACertificate              : {48, 130, 4, 78...}
HashAlgorithm              : SHA1
SigningFlags               : 605
SigningCertificate         :
ReminderDuration           : 90
ErrorCode                  : 2147483658
CSPName                    :
KeySpec                    :
ProviderCLSID              : {4956d17f-88fd-4198-b287-1e6e65883b19}
ProviderProperties         : {BaseCrlUrls, http://www.contoso.com/pki/contoso-DC2-CA.crl, DeltaCrlUrls, http://www.cont
                             oso.com/pki/contoso-DC2-CA+.crl}
Modified                   : True
LocalRevocationInformation :
SigningCertificateTemplate : OCSPResponseSigning
CAConfig                   : dc2.contoso.com\contoso-dc2-ca



PS C:\> $OCSPAdmin.SetConfiguration("dc2",$true)
PS C:\>

И, собственно, результаты наших трудов в UI:

Online Responder revocation configuration UI

Профит получен. Вот так, нехитрым способом можно автоматизировать создание конфигураций для Online Responder.

з.ы. в ближайшее время я планирую доставить очередную версию пошпкимодуля и там будет целый набор классов .NET, которые позволяют проверить работоспособность и правильность настройки респондера (путём отправки запроса и декодированием ответа) в соответствии с RFC2560. Так что ждите анонсов.


Share this article:

Comments:

Comments are closed.