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