如何在LDAP中使用userPKCS12存储密钥库?

时间:2015-10-29 12:45:31

标签: java ldap keystore

我有一个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脚本解决方案。

谢谢和问候,

丹尼尔

1 个答案:

答案 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:openssl enc -e -base64 -in tomcat.p12 -out tomcat.b64
  • Java with Bouncy Castle:Base64.encode()
  • 某些LDAP服务器(如Sun Directory Server,389或RedHat Directory Server)包含一个名为&#34; ldif &#34;的命令行工具。这完全符合您的要求:ldif -b "userPKCS12" < tomcat.p12 >> p12.ldif