Powershell: Как получить значение base64 из атрибута объекта SearchResultEntry? - PullRequest
0 голосов
/ 14 апреля 2020

Моя цель - извлечь опубликованный CRL CA из соединения LDAP. У меня есть функция для поиска в LDAP (не в Active Directory!), Которая возвращает System.DirectoryServices.Protocols.SearchResultEntryCollection, как и ожидалось.

$results = LDAPsearch "$_LDAP_server`:$_LDAP_searchPort" "cn=$CA,$_LDAP_searchBase" '(&(certificateRevocationList=*))'
ForEach ($element in $results){
    $element.Attributes['cn'].GetValues('string')
    $element.Attributes['certificateRevocationList;binary'].GetValues('string')
}

Приведенное выше правильно читает значение атрибута cn каждого возвращаемого элемента, однако certificateRevocationList возвращается в странном формате, который совсем не соответствует ожидаемой мной строке Base64 (например, той, которую можно прочитать, если вы экспортируете свои данные в файл LDIF или если вы используете команду Linux ldapsearch). ..

Как я могу получить фактическое значение Base64?

К сожалению, вы можете передать только 'byte []' или 'string' в качестве параметра методу GetValues ​​(опция 'Base64String') здесь было бы полезно для меня, но хорошо ...).

Токовый выход ниже (где cn значение написано правильно, но не certificateRevocationList):

How the output looks like

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Получите необработанный CRL как byte[], затем конвертируйте в base64 самостоятельно:

$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')
$crlB64 = [Convert]::ToBase64String($crlBin)
0 голосов
/ 16 апреля 2020

Просто добавив опцию, которую я в итоге использовал, гораздо проще, поскольку моей конечной целью было на самом деле сохранить CRL в виде файла (и иметь возможность его анализировать):

$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')[0]
[IO.File]::WriteAllBytes("$_localDir\CRL_$CA.crl",$crlBin)

Это записывает фактическую Файл CRL в формате DER (затем его можно легко переключить на PEM, используя certutil или openssl, если необходимо). Моя первоначальная идея состояла в том, чтобы создать файл CRL в формате PEM из извлеченного значения Base64, но я искал слишком далеко ...

Я оставляю ответ Матиаса как ответ, так как он фактически лучше всего ответил на мой вопрос ; Я не указал, что мне нужен файл CRL.

...