9

公開 RSA キーと秘密 RSA キーを含む JKS ファイルを作成しました。外部パス (c:/file.jks など) を使用してこのファイルをロードすると、プログラムは魅力的に実行されます。ただし、この同じファイルをクラスパスからロードしようとすると、次の例外が発生しました。

java.io.IOException: Invalid keystore format

これは、jks をロードするために使用されるコードです。

 KeyStore keyStore = KeyStore.getInstance("JKS");
 InputStream stream=this.getClass().getResourceAsStream("/lutum.jks") ;
 keyStore.load(stream,passe);

唯一の違いは、外部からロードするときに FileInputStream をフルパスで使用することです。私が間違っていることは何ですか?

4

2 に答える 2

6

一般に、ソリューションは暫定的に機能するはずです。

それらの規定は何ですか?リソース フォルダーがクラスパスにあることを確認します。-cp不明な場合は、プログラムの実行時に渡されるフラグに追加するか、javaEclipse またはその他の IDE を使用している場合は、そのプロジェクトのクラスパスのメンバーとしてリストされていることを確認してください。

次に、質問に関連するこのスタックオーバーフローを確認してください。クラスの getResourceAsStream() メソッドを使用する方法は有効ですが (/ファイル名の先頭に を含めると、クラス リソース ローダーが ClassLoader のメソッドに従うようになります)、ClassLoader を直接使用する方がおそらく混乱は少ないでしょう。別の良い例がここにあります

そのため、最初に、リソース フォルダーが明示的にクラスパスの一部であることを確認してください。次に、リソースを見つけるために次の構造を優先します。

InputStream stream= this.class.getClassLoader().getResourceAsStream("lutum.jks");

/ファイル名に欠落があることに注意してください。これは、ClassLoader が「プロジェクト ルート」で自動的に検索を開始し、スラッシュが問題を引き起こす可能性が高いためです (たとえば、JBoss または Tomcat にデプロイする場合、クラスローダーによって代わりに絶対ファイル システム パスとして解釈される可能性があります)。相対パスの)。

これが役立つことを願っています。そうでない場合は、プロジェクトの詳細をコメントしてください。それに応じて回答を変更します。

于 2014-03-05T17:43:37.893 に答える
4

2 つのキーストアは実際には同じではなく、クラスパス上のキーストアが何らかの理由で破損していると思われます。

2 つのキーストアを比較してみてください。次のようなファイルをバイト配列に読み込むだけです。

    public static byte[] streamToByteArray(InputStream is) throws IOException {
        ByteArrayOutputStream tmp = new ByteArrayOutputStream();
        int b = is.read();
        while (b > -1) {
            tmp.write(b);
            b = is.read();
        }
        tmp.flush();
        return tmp.toByteArray();
    }

そして、次のように比較します。

    InputStream cpStream = this.getClass().getResourceAsStream("/lutum.jks");
    InputStream fileStream = new FileInputStream("c:/file.jks");

    byte[] cpBytes = streamToByteArray(cpStream); 
    byte[] fileBytes = streamToByteArray(fileStream);

    if (Arrays.equals(cpBytes, fileBytes)) {
        System.out.println("They are the same.");
    } else {
        System.out.println("They are NOT the same.");
        // print the file content ...
    }
于 2014-03-07T22:55:51.603 に答える