В заключительной части этой беседы мы поговорим об удалении и создании конфигураций отзыва для 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:
Подразумевается, что вы настроили права на шаблон и права на закрытый ключ (Network Service — Allow Read).
Если мы создаём конфигурацию для Standalone CA и/или для CA, который не является членом текущего леса Active Directory:
В этом случае вы самостоятельно должны доставить сертификат подписи в хранилище сертификатов и назначить права на чтение закрытого ключа для 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 нам необходимы следующие флаги:
Если все эти флажки сложить, то должно получиться что-то вроде 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.
з.ы. в ближайшее время я планирую доставить очередную версию пошпкимодуля и там будет целый набор классов .NET, которые позволяют проверить работоспособность и правильность настройки респондера (путём отправки запроса и декодированием ответа) в соответствии с RFC2560. Так что ждите анонсов.
Comments: