2017-08-25 9 views
-2

転送する必要があるすべての情報を含むJSONファイルを生成しようとしています。別のシステムで操作を行う必要があります。フィールドの1つはJava証明書です。私はファイルの内容を別のシステム上に複製する必要があるので、内容を直接読み取ってからファイルに書き込むと思った。しかし、新しく書き込まれたファイルを読み込んでいるうちに、私は次のようになります: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); 

は、私が使用しています新しいファイルを書き込む:

ストアは、いくつかのJSONファイルに埋め込まれたの考え方にもかかわらず
FileUtils.writeByteArrayToFile(trustFile, trustJsonContent.getBytes()); 

答えて

1

は奇妙に見えますJSONフィールドにバイナリデータを/からStringとして取り込み/取得する正しい方法の1つを見つけることができます。上記の、あなたの最初のアプローチに反対

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コモンコーデックライブラリが必要で、全く同じようなものを使用しています。org.apache.commons.codec.binary.Base64encodeBase64String(byte[])decodeBase64(String)

注2方法を参照してください、それがどのように使用するかにjavadocにご相談ください:Base64 formatは、バイナリデータのサイズを初期ために+ 33%より多くのオーバーヘッドを生成し、それはかなり大きなファイル

をするために注意して使用する必要があります
+0

ありがとうございます、私はあなたの提案されたアプローチを試みます。私はあなたがデフォルトのJava証明書フォーマットを.pemフォーマットにも変換できることを読んでいました。私はそれについてもっと読む予定です。 pem形式に証明書と秘密鍵の両方が含まれているかどうかわからない場合は、後で証明書を再構築するためにjsonファイルに別のフィールドとして格納しておく必要があります。 – lex

+0

[RFC7468](https://tools.ietf.org/html/rfc7468)によると、.pemのテキスト表現は2つの囲み線を含む必要があります( '--- Begin ... ---'と '--- End ... ---- ')をbase64の内容で置き換えます。 .pemが正しいJSONフィールド値になるように見えます。これらの2つの改行文字をエスケープして、デシリアライズ時にエスケープする必要があります。これは、一方ではJSON(人間はJSONからpem certを簡単に抽出してそれをさらに処理することができます)を理解しやすくし、他方では追加の処理労力によって支払いを行います。答えとしてあなたのPEMオプションを追加しますか? – Kostiantyn

+0

今のところ、すべてを私の仕事で、すべてをBase64でエンコードされた文字列に変換するだけです。そして、文字列をバイト配列としてデコードし、ファイルに書き込むシステムでは、ありがとう! – lex

関連する問題