2016-06-10 161 views
0

私用密鑰生成問題在生成私鑰

  public PrivateKey getStoredPrivateKey(String filePath) { 
    PrivateKey privateKey = null; 
    byte[] keydata = getKeyData(filePath); 
    PKCS8EncodedKeySpec encodedPrivateKey = new PKCS8EncodedKeySpec(keydata); 
    KeyFactory keyFactory = null; 
    try { 
     keyFactory = KeyFactory.getInstance("RSA"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    try { 
     System.out.println("hello"); 
     privateKey = keyFactory.generatePrivate(encodedPrivateKey); 
    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } 
    return privateKey; 
} 

我使用它在這裏

PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath); 

但其示值誤差

hello 
    java.security.spec.InvalidKeySpecException:       
    java.security.InvalidKeyException: IOException : version mismatch: (supported:  00, parsed:  03 
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source) 

我傳遞一個(或.p12)文件在getStoredPrivateKey(String filePath)函數中。

爲什麼它給錯誤?

+0

你確定你的私鑰是spec PKCS#8的。嘗試使用其他規範,如RSAPrivateKeySpec –

+0

如何識別其不是PKCS#8 – Mudit

回答

1

P12是密鑰庫類型,其中可以存儲多個密鑰和證書,並且可以使用密碼來保護它們。您可以在Internet上搜索P12(PKCS12)。你的文件是P12文件,所以很有可能是PKCS12格式的文件。

要從P12文件獲取私鑰,請使用以下代碼。在調用此代碼之前,您需要下面的東西。

filePath。 P12文件的字符串路徑(絕對)。

filePassword。這是一個char []。代表p12文件的密碼。

keyPassword。這是一個char []。代表私鑰的密碼。大多數 可能與filePassword相同。

別名。一個字符串。使用哪個別名表示存儲在P12 存檔/密鑰存儲中的私鑰。

要檢查什麼是你的私鑰的別名,你可以使用下面的命令

keytool -list -v -keystore <yourfile>.p12 -storetype pkcs12 

它會詢問你的密碼,然後打印多行。尋找

Entry Type: PrivatKeyEntry 

在那裏你會找到別名。

初始化這些變量,然後使用下面的代碼獲取私鑰。您還可以獲得與此密鑰關聯的證書/公鑰。尋找PrivateKeyEntry的API

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
keyStore.load(new FileInputStream(filePath), filePassword); 
PrivateKeyEntry keyEntry = (PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(keyPassword)); 
PrivateKey key = privateKeyEntry.getPrivateKey();