2012-09-10 96 views
1

我正在尝试读取一个私钥java java。我学会了这么做,我必须从pfx格式的完整证书中提取私钥。 我曾尝试下面的开放SSL命令PFX转换为PEM再到PK8,但是当我试图读取Java中的关键,它说无效的密钥格式我如何从一个pfx证书中读取java中的私钥

转换PFX到PEM

 openssl pkcs12 -in C:\Documents\xbox-token\conversion\xbox 
    token-FullCert.pfx -nocerts -out C:\Documents\xbox-token\conversion\xboxkey.pem 

删除密码保护

openssl rsa -in C:\Documents\xbox-token\conversion\xboxkey.pem -out C:\Documents\xbox-token\conversion\xboxkey.pem 

转换PEM到PK8

openssl pkcs8 -topk8 -in C:\Documents\xbox-token\conversion\xboxkey.pem -out C:\Documents\xbox-token\conversion\xboxprv.pk8 

在Java代码中

byte[] encodedPrivateKey=null; 
    File privateKeyFile = new File("C:/Documents/xbox-token/conversion/xboxprv.pk8"); 
    FileInputStream inputStreamPrivateKey = null; 
    try { 
     inputStreamPrivateKey = new FileInputStream(privateKeyFile); 
      encodedPrivateKey = new byte[(int)privateKeyFile.length()]; 
      inputStreamPrivateKey.read(encodedPrivateKey); 
      inputStreamPrivateKey.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    // Create the private key. 
    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); 
    System.out.println(encodedPrivateKey); 
    System.out.println(privateKeySpec); 
    RSAPrivateKey privateKey = null; 
    try { 
     privateKey = (RSAPrivateKey)KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec); 
    } catch (InvalidKeySpecException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

我正在一个java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:无效的密钥格式

任何一个可以帮助

+1

我找到了答案,这个从后下 http://stackoverflow.com/questions/7525679/how-to-get-the-java-security-privatekey-object-from-rsa-privatekey -pem-from-af –

回答

3

我觉得关键是使用openssl做一点点工作,然后获得keytool来完成所有真正的工作。因此,使用openssl将您现有的证书和密钥转换为PKCS12文件。使用openssl你会有类似的东西。

openssl pkcs12 \ 
    -export -in cert.crt \ 
    -inkey cert.key \ 
    -certfile ica.crt \ 
    -name "yourKey" \ 
    -out cert.p12 

然后神奇的是,以中.P12导入到密钥存储,如果它是另一个密钥库

$JAVA_HOME/bin/keytool \ 
    -importkeystore -deststorepass secret \ 
    -destkeypass secret -destkeystore $KEYSTORE \ 
    -srckeystore cert.p12 \ 
    -srcstoretype PKCS12 \ 
    -srcstorepass secret \ 
    -alias "yourKey" 

您有使用该Java中,但我希望一个完整的答案涉及以下选项。

import java.security.KeyStore; 
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
FileInputStream instream = new FileInputStream(new File("/your/keystore")); 
trustStore.load(instream, "secret".toCharArray()); 

希望它的作品!

+0

但是我确实需要它作为p8而不是p12。我添加的程序只是其中的一部分。我需要它在p8格式,因为我需要使用密钥做saml解密 –

0

鉴于您没有为您的OpenSSL命令指定输出格式,您将得到一个PEM编码文件。 Java将期望DER编码。相反,你最后的OpenSSL电话试试:

openssl pkcs8 -topk8 -inform=PEM -outform=DER 
       -in C:\Documents\xbox-token\conversion\xboxkey.pem 
       -out C:\Documents\xbox-token\conversion\xboxprv.pk8 

的“-inform”参数不应该要求(似乎默认值),但“-outform”可能是。

如果你想检查你有什么格式:PEM文件是ASCII(Base64编码),DER文件是二进制文件。如果你的文本编辑器喜欢它,Java可能不会。

相关问题