我有一个java密钥库,我想使用userPKCS12属性存储在LDAP中。我已经将JKS密钥库转移到了PKCS12
keytool -importkeystore -srckeystore /opt/tomcat/conf/.keystore -destkeystore /tmp/tomcat.p12 -deststoretype PKCS12
如何最终将此密钥库的条目存入我的LDIF文件?
dn: cn=$name,$cn
objectClass: top
objectClass: inetorgPerson
description: $name
cn: $name
sn: $name
userPKCS12;binary:: MIIQoAIBAzCCEFoGCSqGSIb3DQEHAaCCEEsEghBHMIIQQzCCCfAGCSqGSIb3DQEH
AaCCCeEEggndMIIJ2TCCCdUGCyqGSIb3DQEMCgECoIIJgjCCCX4wKAYKKoZIhvcN
AQwBAzAaBBQJgfNb/kt83JjEL34s/vE5pFjL0wICBAAEgglQ0DQ23QhylRz4uvMr
lleD94JSA6hdpLjsee3zxqxsPXgyz1CtsY159vw4F6rSHeSDaILve8g2w/nA0KPH
V/QbsbAU6/g8tvqBGbbLJFbe20m9ZhAOeohPdLzT54SViJ8b3VvZf5rWCidUaYQu
7yNqjkXAbuezRxf3TMEuR9BNQV+DWLjvNmiMGN3b1rQ0jFZHKk1VJnb6OUn63UUT
dRun7OUdi9zR4WM7yKy0VNmC3xaI630PABibIACMdGaQGprQM6HrchkxP2M3D5jm
8UwCkEYazd7eKyKiAEEMnK5o3nKYWbd+NmELssendiEoi3ztrLTZnEdIwUc9wA3/
yJgcptUjzbh/2NwKdyO21Snj9iGWyw90KqI3hfL1HqiYKjF+sZ9nudxFLwbmYi0Y
.....
给出了这个错误:
ldapadd -h 10.1.0.99 -D cn=Directory\ Manager -w - -f action.ldif
Enter bind password:
adding new entry cn=abcd,dc=Example,dc=com
ldap_add: Undefined attribute type
ldap_add: additional info: Entry cn=abcd,dc=Example,dc=com can not be added because BER encoding of userPKCS12 attribute is not supported
首选bash脚本解决方案。
谢谢和问候,
丹尼尔
答案 0 :(得分:1)
LDIF中的二进制数据
LDIF文件中的二进制数据只是Base64编码(参见RFC 2849):
userPKCS12:: MIIJtgIBAzCCCXAGCSqGSIb3DQEHAaCCCWEEggldMIIJWTCCBW4GCSqGSIb3DQEHA
CCBV8EggVbMIIFVzCCBVMGCyqGSIb3DQEMCgECoIIE+jCCBPYwKAYKKoZIhvcNAQwBAzAaBBT3WG
...
RFC 2849明确声明不需要换行符:
10)当attrval-spec,distinguishedName或rdn是base64- 编码后,[5]中指定的编码规则与 以下例外:a)base64输出的要求 流必须表示为不超过76的行 字符被删除。 LDIF文件中的行只能折叠 根据上文注释2中描述的折叠规则。
话虽这么说,我从来没有见过没有折叠长线的LDIF文件。因此,出于兼容性原因,最后在76个字符后添加换行符可能是个好主意。
LDIF折叠线的规则是:
2)LDIF文件中的任何非空行,包括注释行 可以通过插入行分隔符(SEP)和空格来折叠。 折叠不得出现在行的第一个字符之前。 换句话说,将一条线折叠成两条线,第一条线 这是空的,是不允许的。任何以a开头的行 单个空间必须被视为前一个的延续 (非空)线。连接折叠线时,恰好是一个空格 每个续行开头的字符必须是 丢弃。实现不应该在中间折叠线 一个多字节的UTF-8字符。
对外部文件的引用
二进制数据不一定必须作为Base64字符串包含在LDIF文件中。而是可以使用对外部文件的引用。 RFC 2849的示例:
jpegphoto:< file:///usr/local/directory/photos/fiona.jpg
转让选项&#34 ;;二进制&#34;
二进制选项&#34 ;;二进制&#34;在RFC 4522中指定,它会影响LDAP客户端和服务器之间的数据传输(而不是LDAP服务器上的存储)。设置后,将根据基本编码规则(BER)对属性进行编码。
是否&#34 ;;二进制&#34;是&#34; userPKCS12&#34;取决于LDAP服务器。例如,使用OpenLDAP&#34 ;;二进制&#34;不起作用,因为&#34; userPKCS12&#34;的语法是二进制的(而不是PKCS#12的特殊语法)。
将二进制数据转换为Base64
有很多方法可以将PKCS#12文件转换为Base64,如果必须以编程方式或使用命令行工具执行此操作,则无法编写。一些选项是:
openssl enc -e -base64 -in tomcat.p12 -out tomcat.b64
ldif -b "userPKCS12" < tomcat.p12 >> p12.ldif