2016-06-01 20 views
0

私は、証明書を作成する外部サービスを用意しています。このサービスのうち、バッファ(String)を受け取ります。このバッファを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サービスを使用します。これは16進文字列であり、KeyStoreはバイト配列を想定しているため、hexStringToByteArrayを使用する必要があります。バイト配列を元に戻さないと、Javaは「ロード」メソッドで例外をスローします。データはPKCS12形式ではありません。 C#はバイト配列を逆転させるので、私もそれを逆にしました。 Javaは "load"で例外をスローしなくなりましたが、今説明したように、 "store"に例外をスローします。 – Adam

+0

C#でHex変換 - >バイト - >逆が同じ動作をしない可能性があります。メモ帳++などの16進バイトの変換をサポートするテキストエディタなど、サーバーから返される形式を確認することをお勧めします。ファイルを見ることなく、私はもっと助けることができません – 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); 
関連する問題