使用 curl 仅下载 LDAP 属性值

使用 curl 仅下载 LDAP 属性值

我正在使用以下 curl 命令从 LDAP 目录下载值:

curl  ldap://example.com/CN=ACME-Test-CRL,O=ACME?certificateRevocationList;binary -o crl.crl

问题是它将以下内容写入文件 crl.crl:

DN: CN=ACME-Test-CRL,O=ACME certificateRevocationList;binary: MIICxzCBsAIBATAN...

当我只想要 base64 编码的 CRL 即以 MIICxzCBsAIBATAN 开头时

有没有办法告诉 curl 只将 base64 编码的二进制值写入文件?

答案1

尝试在 OpenVPN 的“crl-verify”命令上应用我的 Active Directory CA 的 CRL 时遇到了同样的问题。

我的解决方案如下:

curl -o CAName.ldap -u domain\\username:password "ldap://domaincontroller.domain.local/CN=CAName,CN=ServerName,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local?certificateRevocationList" && grep -Po '(?<=certificateRevocationList:: )(.+)' CAName.ldap > CAName.b64 && base64 -d CAName.b64 > CAName.der && openssl crl -inform DER -in CAName.der -outform PEM -out CAName.pem

解释:

curl -o CAName.ldap -u domain\\username:password "ldap://domaincontroller.domain.local/CN=CAName,CN=ServerName,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local?certificateRevocationList"

此命令将包含 DN 和 base64 加密内容的二进制部分下载到输出文件“-o CAName.ldap”。非匿名 ldap 绑定需要“-u”部分。

grep -Po '(?<=certificateRevocationList:: )(.+)' CAName.ldap > CAName.b64

这会将 base64 部分放入新文件“CAName.b64”中

base64 -d CAName.b64 > CAName.der

将 base64 内容(从 ldap 查询转换为二进制)解密到新文件“CAName.der”

openssl crl -inform DER -in CAName.der -outform PEM -out CAName.pem

现在将 DER(二进制)转换为 PEM,以用于 OpenVPN 的“crl-verify”。

您可以使用 openssl 来验证内容:

openssl crl -inform PEM -text -noout -in CAName.pem

答案2

四年后……

您收到的文件位于LDAP 数据交换格式 (LDIF)格式。因此,最好的情况是,您将使用LDIF解析来获取certificateRevocationList属性(见下文)。然而,我遇到的所有 CRL 服务器都没有正确应用 LDIF 语法,因此解析器很难理解这些文件。这让您只能手动解析:

curl ldap://endpoint | 
  sed -n 's/[[:space:]]*certificaterevocationlist;binary:: \(.*\)/\1/p' > file.crl

上述代码将 CRL 的 base64 格式值保存到 中file.crl。但是,您可以直接将代码导入openssl进行进一步处理:

curl ldap://endpoint | 
  sed -n 's/[[:space:]]*certificaterevocationlist;binary:: \(.*\)/\1/p' |
  base64 --decode |
  openssl crl -inform der -noout -text

一句忠告:

应当指出的是解析手动构建结构化数据,即使用grepawk等,通常是一种非常坏的想法。我sed在这里使用这个作为最后的手段,因为我尝试过的所有解析器都没有成功(Net::LDAP::Entry对于 Perl,ldif对于 Python,以及ldif对于 nodeJS) 来说,能够在不进行任何事先修改的情况下解析 LDIF 文件。

相关内容