2017-05-17 251 views
-1

这里我们试图在RunTime期间使用客户机私钥创建密钥库。 我们正在将privateKey加载到密钥库中时遇到。使用RSA私钥创建密钥库

JKS类型:

clientKey=-----BEGIN RSA PRIVATE KEY----- ...-----END RSA PRIVATE KEY-----" 
KeyStore keyStore = KeyStore.getInstance("JKS"); 

keyStore.load(new ByteArrayInputStream(clientKey.getBytes()), "*********".toCharArray()); 

Exception: 
java.io.IOException: Invalid keystore format 
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658) 
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56) 
at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224) 
at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70) 

PKCS12类型:

clientKey=-----BEGIN RSA PRIVATE KEY----- ...-----END RSA PRIVATE KEY-----" 

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
keyStore.load(new ByteArrayInputStream(clientKey.getBytes()), "*********".toCharArray()); 

Exception: 
java.io.IOException: toDerInputStream rejects tag type 45 
at sun.security.util.DerValue.toDerInputStream(DerValue.java:847) 
at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1915) 
at java.security.KeyStore.load(KeyStore.java:1445) 

请帮助解决这个问题。

+0

私钥不是一个基石,任何格式。不清楚你在问什么,或者试图,或者你为什么会认为这会起作用。 – EJP

回答

0

您的clientKey有开始和结束标题。您必须删除它们,然后解码密钥并将其提供给ByteArrayInputStream

您可以删除由-----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----

clientKey = clientKey.replace("-----BEGIN RSA PRIVATE KEY-----", ""); 
clientKey = clientKey.replace("-----END RSA PRIVATE KEY-----", ""); 

然后你所留下的是Base64编码格式(PEM)。如果它不是base64编码格式,则需要确定编码类型并对其进行解码。如果base64编码,你可以做下面的解码:

new ByteArrayInputStream(Base64.decode(clientKey)); // <-- clientKey here is without the headers.