2017-08-25 28 views
-2

我正在嘗試生成一個JSON文件,其中包含我需要傳輸的所有必需信息並在另一個系統上執行進一步的操作。其中一個字段是java證書。由於我只需要複製文件的內容,因爲它在另一個系統上,我認爲直接讀取內容然後寫入文件是可行的。但是當加載新寫入的文件時,我得到:如何將Java證書文件編寫爲Json字符串字段?

Caused by: 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) 
    at java.security.KeyStore.load(KeyStore.java:1445) 

這樣做的正確方法是什麼?

目前,用於讀取原始憑證,我使用:

FileUtils.readFileToString(originalTrustFile); 

寫我使用一個新的文件:

FileUtils.writeByteArrayToFile(trustFile, trustJsonContent.getBytes()); 

回答

1

儘管具有密鑰庫嵌入在一些JSON文件的想法看起來很奇怪對於我來說,下面你可以找到正確的方法之一,即將二進制數據作爲字符串放入/從JSON字段中檢索。

import java.util.Base64; //for Java 8 
import org.apache.commons.io.FileUtils; 

//encode to Base64 
byte[] binaryFileBytes = FileUtils.readFileToByteArray(originalTrustFile); 
String jsonFieldValue = Base64.getEncoder().encodeToString(binaryFileBytes); 

//decode from Base64  
String jsonFieldValue = ... //obtain from your JSON 
byte[] binaryFileBytes = Base64.getDecoder().decode(jsonFieldValue); 
FileUtils.writeByteArrayToFile(trustFile, binaryFileBytes); 

相對的初始方法,上面會產生保證安全的字符串,其將不與JSON保留符號干擾並因此不會在逸出或反串行化

注1被破壞:對於Java 7和早些時候,您需要在類路徑中使用apache commons-codec庫,並且使用非常類似的org.apache.commons.codec.binary.Base64。與javadoc它應該如何使用諮詢,請參閱方法encodeBase64String(byte[])decodeBase64(String)

注2Base64 format產生+ 33%的開銷初始二進制數據的大小,因此必須謹慎使用相當大文件

+0

謝謝,我會嘗試你建議的方法。我剛剛讀到,您可以將默認的Java證書格式轉換爲.pem格式。我會更詳細地閱讀它。不知道pem格式是否可以同時包含證書和私鑰,或者我必須解壓縮它們並將它們作爲單獨的字段放入json文件中,以便稍後重新構建證書。 – lex

+0

根據[RFC7468](https://tools.ietf.org/html/rfc7468),.pem的文本表示必須包含2個封閉行('--- Begin ... ---'和'--- End ... ----'),中間是base64內容。似乎讓.pem成爲一個正確的JSON字段值,你應該注意逃離那兩個換行符,並且在反序列化時避開它們。這樣可以提供更多可理解的JSON(一方面人類可以輕鬆從JSON中提取Pem證書並進一步處理),另一方面通過額外的處理工作支付。你打算在這裏添加你的PEM選項作爲答案嗎? – Kostiantyn

+0

現在,我只能將所有內容都轉換爲Base64編碼的字符串,然後在另一個系統上將字符串解碼爲字節數組並將其寫入文件。謝謝! – lex

相關問題