2016-04-04 21 views
0

JKSからKeyとその証明書チェーンを抽出しましたが、今ではこのキーをJavaを使用してWindowsキーストアに追加しようとしています。私は次のことをやった私のJKSロードするにはプログラムでWindows証明書ストアに秘密鍵を追加する方法

String jksPath = "D:\\mykeystore.jks"; 
    KeyStore keystore = KeyStore.getInstance("JKS"); 
    FileInputStream fIn = new FileInputStream(jksPath); 
    keystore.load(fIn, "12345678".toCharArray()); 

は、その後、私は、キーと証明書チェーンを取得:

Key key = keystore.getKey("res1", "12345678".toCharArray()); 
    Certificate[] cchain = keystore.getCertificateChain("res1"); 

これまでのところは良い、私はこのキーを追加しよう私のWindowsのキーストア:

KeyStore ks = KeyStore.getInstance("Windows-MY"); 
    ks.load(null, null); 
    ks.setKeyEntry("myKey", key, "12345678".toCharArray(), cchain); 

そしてBOOM

スレッド "main"の例外java.lang.ClassCastException:[Ljava.security.cert.Certificate; [Ljava.security.cert.X509Certificate;にキャストすることはできません。at sun.security.mscapi.KeyStore.engineSetKeyEntry(KeyStore.java:402) at sun.security.mscapi.KeyStore $ MY.engineSetKeyEntry(KeyStore.java:62) java.security.KeyStore.setKeyEntry(KeyStore。 java:909)

のsetKeyEntryコールによって例外がスローされます。

P.S:JKSタイプのキーストアで同じ構文を使用する場合、例外はスローされません。

答えて

3

sun.security.mscapi.KeyStore.engineSetKeyEntry()の実装にJavaコードがぎこちないようです。 の証明書( "[Ljava.security.cert.Certificate"、接頭辞がクラス名にあることに注意してください)をのX509Certificates( "[Ljava.security.cert.X509Certificate")]に変換しようとします。これはjavaがあなたに単純なキャスト式(例えば、discussionの似たようなミスを参照)で行うことを許可しているものではありません。

私が似たような状況で行ったのは、証明書配列を単純な証明書配列ではなく、X509Certificate配列としてkeyStore.setKeyEntry()メソッド呼び出しに渡すことでした。

関連する問題