0

我的目标是从 LDAP 连接中获取 CA 的已发布 CRL。我有一个搜索 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):

输出的样子

4

2 回答 2

1

将原始 CRL 检索为byte[],然后自己转换为 base64:

$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')
$crlB64 = [Convert]::ToBase64String($crlBin)
于 2020-04-14T12:39:23.787 回答
0

只需添加我最终使用的选项,就容易多了,因为我的最终目标实际上是将 CRL 保存为文件(并能够解析它):

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

这会以 DER 格式写入实际的 CRL 文件(然后可以使用certutilopenssl在需要时轻松切换到 PEM)。我最初的想法是从提取的 Base64 值构造一个 PEM 格式的 CRL 文件,但我看得太远了......

我将 Mathias 的回答作为答案,因为他实际上最好地回答了我的问题;最后我没有指定我想要一个 CRL 文件。

于 2020-04-16T15:03:41.647 回答