我正在尝试使用“userCertificate”属性来保存“der”文件。我可以愉快地使用 ldif 添加我的证书:
dn:cn=bob,ou=users,dc=home
changetype:修改
add:userCertificate;binary
userCertificate;binary:<file:///home/bob/cert.der
当我进行 ldapsearch 时,我看到我的证书采用 base64 编码,生活似乎很好。但是当我尝试使用 ldapcompare 时:
ldapcompare -D"cn=admin,dc=home" -W "cn=bob,ou=users,dc=home" "userCertificate;binary:<file:///home/bob/cert.der"
我得到错误:
比较结果:无效语法 (21)
附加信息:无法标准化匹配
UNDEFINED的值
如果我尝试使用 base64 编码进行比较,我会得到同样的错误
ldapcompare -D"cn=admin,dc=home" -W "cn=bob,ou=users,dc=home" "userCertificate:: base64encodedStringOfStuff"
有任何想法吗?
此错误消息非常清楚地引用了RFC 4523 第 2.1 节中的规定。在影响属性userCertificate的所有 LDAP 操作中,您只需始终附加
;binary
到属性名称。使用比较操作时,您必须查看哪个EQUALITY匹配规则可用于断言属性。
在子模式中userCertificate是
EQUALITY certificateExactMatch
根据颁发者名称和序列号声明的(请参阅RFC 4523 第 2.5 节),这意味着该属性没有可用的纯八位字节字符串匹配。因此,您需要从证书中提取十进制序列号和颁发者 DN(LDAP 字符串表示):
将本例中的十六进制序列转换为十进制,
1005070
并像这样调用ldapcompare:补充说明:
;binary
传输类型。但是对于 OpenLDAP,它也不会受到伤害。不确定其他 LDAP 服务器实现。请注意,我有一个 PEM 编码的证书,而不是一个 DER 编码的证书。您可以使用
openssl
在 PEM 中转换/显示 DER:openssl x509 -in /home/bob/cert.der -inform DER
此命令将以 PEM 格式显示您的证书。像这样的东西:
我删除了顶线和底线,只是为了获得 Base64 编码的部分。而且,我执行了以下命令将其加载到
usercertificate
属性中:请注意每个 Base64 编码行前面的前导单个空格。它是 LDIF 中的延续标记。而且,当我使用 搜索时
ldapsearch
,我看到:我从来没有让它与
< file:
针对 DER 或 PEM 文件的指令一起使用(没有CERTIFICATE
标记)。我会做更多的调查,看看有什么遗漏。但是,如果您将多行 Base64 编码证书(PEM 格式)减少为单行,那么您可以进行比较如果/当我可以让它与
< file:
指令一起工作时,我会更新它。