我有一个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:openssl enc -e -base64 -in tomcat.p12 -out tomcat.b64
  • Java和Bouncy Castle:Base64.encode()
  • 一些LDAP服务器(如Sun Directory Server,389或RedHat Directory Server)包括一个名为“ldif”的命令行工具,它可以完全满足您的要求:ldif -b "userPKCS12" < tomcat.p12 >> p12.ldif
  • 09-28 09:14