我有一个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脚本的解决方案是首选。
感谢致敬,
丹尼尔
最佳答案
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
传输选项“; binary”
二进制选项“; binary”在RFC 4522中指定,它影响LDAP客户端和服务器(而不是LDAP服务器上的存储)之间的数据传输。设置后,将根据基本编码规则(BER)对属性进行编码。
“userPKCS12”是否需要“; binary”取决于LDAP服务器。例如,对于OpenLDAP,“; binary”不起作用,因为“userPKCS12”的语法是二进制的(而不是PKCS#12的特殊语法)。
二进制数据到Base64的转换
有很多方法可以将PKCS#12文件转换为Base64,并且如果必须通过编程或使用命令行工具执行此操作,则无需编写。一些选项是:
openssl enc -e -base64 -in tomcat.p12 -out tomcat.b64
ldif -b "userPKCS12" < tomcat.p12 >> p12.ldif