2013-04-26 25 views
2

我想从java中的文件加载私钥。该密钥由ssh-agent生成。实际上,我用下面的代码:当从文件加载RSA私钥时InvalidKeySpecExeption

 public PrivateKey getPrivateKeyFromFile() { 
    try { 
     //String privateKey = readFileAsString(System.getProperty("user.dir")+"/clefs/"+privateKeyName); 
     //byte[] encodePrivateKey = privateKey.getBytes(); 
     File filePrivateKey = new File(System.getProperty("user.dir")+"/clefs/"+privateKeyName); 
     FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+"/clefs/"+privateKeyName); 
     byte[] encodePrivateKey = new byte[(int) filePrivateKey.length()]; 
     fis.read(encodePrivateKey); 
     fis.close(); 

     java.security.KeyFactory keyFactory = java.security.KeyFactory.getInstance("RSA"); 
     PKCS8EncodedKeySpec privatekeySpec = new PKCS8EncodedKeySpec(encodePrivateKey); 
     PrivateKey prikey = (PrivateKey) keyFactory.generatePrivate(privatekeySpec); 
     return prikey; 

    } catch (NoSuchAlgorithmException ne) { 
     ne.printStackTrace(); 
    } catch (InvalidKeySpecException is) { 
     is.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 

} 

但它产生此异常:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format 
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217) 
at java.security.KeyFactory.generatePrivate(KeyFactory.java:372) 
at com.nguyenkim.cea.signature.SignChallenge.getPrivateKeyFromFile(SignChallenge.java:53) 
at com.nguyenkim.cea.signature.SignChallenge.main(SignChallenge.java:128) 
Caused by: java.security.InvalidKeyException: invalid key format 
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:341) 
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:367) 
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:91) 
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75) 
at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316) 
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213) 
... 3 more 

这里是私人密钥:

-----BEGIN RSA PRIVATE KEY----- 
    MIIEowIBAAKCAQEAszReSzBumVb9GR/f3ClgykWE4UsONan1Ywk/H4+Wbi4HpcwB 
    8Lm9B+zJ94WdRtD8iQYmbUZFoHwFqTjRPtmQfFXcmxfuI7v64bg0csIw8hz1Af2r 
    xo7HBUoVcrTG5k3YrIkjeni/vD9uK6OZ1/lb+/TIvoEp9za577GJxv1omQ6GX7kv 
    baMe2GkfpJmrXnA706OEdyi3Ibdcng/V4lbJ9cm+TIBU2jLBqwEukwpL5VNghuQi 
    3YfpGhnPDBEnh4h5euFs4DGs4FnCgb+00yCuEgJSPvO5HsTnGbwTtEUnkxjtg8vD 
    plD7WenPsyiZqib/rLkNcpfEHKVC6G3QjEuO8QIDAQABAoIBAGliRoFY/fFW4og/ 
    ............................. 
    -----END RSA PRIVATE KEY----- 

有什么建议? 谢谢。

+0

您确定它的RSA?你是否确定密钥的格式正确? – Stephan 2013-04-26 10:10:13

回答

3

你确定它的RSA?你是否确定密钥的格式正确?

如果答案是肯定的,以这两个问题,你可以尝试使用bouncycastle lib

编辑:尝试从键删除这些行:

-----BEGIN RSA PRIVATE KEY----- 
............................. 
-----END RSA PRIVATE KEY----- 

UPDATE:确保你的私钥是PKCS8格式,如果不是,您需要将其转换为here

+0

是的,密钥是由ssh-agent使用以下命令生成的:ssh-keygen -t rsa -C“[email protected]”。我很确定它的格式正确(请参阅上面编辑的问题)。实际上,我知道一种使用弹性城堡来生成一对钥匙的方法,但是当你永远不得不加载从文件生成的钥匙时,这里不会产生任何影响。 – kimthuat 2013-04-26 11:29:48

+0

@ kimthuat:我明白了......我更新了帖子 – Stephan 2013-04-26 11:39:10

+0

我删除了这两行,结果没有改变。问题出现在这一行:PrivateKey prikey =(PrivateKey)keyFactory.generatePrivate(privatekeySpec);我怀疑PKCS8编码有一个错误 – kimthuat 2013-04-26 11:45:55