2016-06-01 74 views
0

我有一個外部服務爲我創建證書,其中我接收了一個緩衝區(字符串)。我嘗試將此緩衝區加載到Java中的KeyStore中,然後使用「存儲」功能創建.p12文件。但是,存儲函數會引發異常 - 「給定的最終塊未正確填充」。使用KeyStore創建.p12文件

無論我嘗試什麼,我都無法得到這個工作或找到問題的原因。

我的代碼是:

public void createP12Certificate(String userName, String comment) throws KeyStoreException, AdminCertificateException, CertificateException, NoSuchAlgorithmException, IOException 
{ 
    KeyStore store = KeyStore.getInstance("PKCS12"); 

    /* Some Code that gets 'buff' etc. */ 

    byte[] byteBuff = hexStringToByteArray(buff); 
    Arrays.reverse(byteBuff); 
    InputStream inputStream = new ByteArrayInputStream(byteBuff); 
    store.load(inputStream, password.toCharArray()); 
    OutputStream outputStream = new FileOutputStream(userName+".p12"); 
    store.store(outputStream,anotherPassword); //Throws Exception 
} 

非常感謝您!

+1

這是您接收內容的格式? hexStringToByteArray和Arrays.reverse的組合非常奇怪 – pedrofb

+0

我試圖複製當前在C#上運行的代碼,因此可以訪問Java中的.net函數。 Java和C#都使用提供緩衝區的外部Web服務(證書的內容)。由於這是一個十六進制字符串,並且KeyStore需要一個字節數組,所以我需要使用hexStringToByteArray。如果我不反轉字節數組,Java會在「加載」方法中引發異常 - 數據不是PKCS12格式。 C#反轉字節數組,所以我也反轉了它。 Java不再在「加載」中引發異常,但現在它按照我的描述在「存儲」中引發一個異常。 – Adam

+0

在C#和java中,十六進制轉換 - >字節 - >反轉的行爲可能不相同。我建議您確保服務器返回的格式,例如使用支持轉換十六進制字節的文本編輯器作爲Notepad ++。沒有看到這個文件,我無法再幫忙 – pedrofb

回答

1

的問題是在這些線路

/* Some Code that gets 'buff' etc. */ 
byte[] byteBuff = hexStringToByteArray(buff); 

因爲其他張貼代碼將沒有例外的工作。

char[] passwordChars = "password".toCharArray(); 
String fileOne = "/tmp/output_1.p12"; 
String fileTwo = "/tmp/output_2.p12"; 

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
keyStore.load(null, null); 
keyStore.store(new FileOutputStream(fileOne), passwordChars); 

keyStore = KeyStore.getInstance("PKCS12"); 
byte[] byteBuff = Files.readAllBytes(Paths.get(fileOne)); 
InputStream inputStream = new ByteArrayInputStream(byteBuff); 
keyStore.load(inputStream, passwordChars); 
keyStore.store(new FileOutputStream(fileTwo), passwordChars);