如何将Java证书文件写入Json字符串字段?

如何将Java证书文件写入Json字符串字段?,java,json,Java,Json,我正在尝试生成一个JSON文件,其中包含传输和在另一个系统上执行进一步操作所需的所有信息。其中一个字段是java证书。因为我只需要在另一个系统上复制文件的内容,所以我认为直接读取内容然后写入文件就可以了。但在加载新编写的文件时,我得到: Caused by: java.io.IOException: Invalid keystore format at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658)

我正在尝试生成一个JSON文件,其中包含传输和在另一个系统上执行进一步操作所需的所有信息。其中一个字段是java证书。因为我只需要在另一个系统上复制文件的内容,所以我认为直接读取内容然后写入文件就可以了。但在加载新编写的文件时,我得到:

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());
要编写我正在使用的新文件,请执行以下操作:

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

尽管在一些JSON文件中嵌入密钥库的想法对我来说很奇怪,但下面您可以找到一种将二进制数据作为字符串放入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编解码器库,并使用非常类似的
org.apache.commons.codec.binary.Base64
。关于如何使用它,请参阅方法
encodeBase64String(byte[])
decodeBase64(String)


注意2:比二进制数据的初始大小增加+33%的开销,因此对于相当大的文件必须谨慎使用

谢谢,我将尝试您建议的方法。我刚刚读到,您还可以将默认的java证书格式转换为.pem格式。我会读更多关于它的内容。不确定pem格式是否可以同时包含证书和私钥,否则我将不得不提取它们并将它们作为单独的字段放在json文件中,以便稍后重新构建证书。根据,pem的文本表示形式必须包含两个封闭行(
--Begin…
--End…
)中间有Base64的内容。似乎让.pem成为正确的JSON字段值,您应该注意转义这2个换行符,并在反序列化时取消转义它们。这一方面提供了更易于理解的JSON(人类可以轻松地从JSON中提取pem证书并进一步使用它),另一方面则需要额外的处理工作。您打算在这里添加您的PEM选项作为答案吗?现在,我可以通过将所有内容转换为Base64编码字符串来推进我的任务。。。然后在另一个系统上,将字符串解码为字节数组并将其写入文件。谢谢