リソースとして war ファイルからロードしている JCEKS キーストアがあります。キーストアを使用して、AES 暗号化の秘密鍵を保存しています。ファイルを直接開く定型プロジェクトでキーストアから読み取ろうとすると、キーストアは正常に機能します。ただし、リソースとしてキーストアにアクセスすると、次の例外が発生します。
java.io.IOException: Keystore was tampered with, or password was incorrect
at com.sun.crypto.provider.JceKeyStore.engineLoad(DashoA13*..)
at java.security.KeyStore.load(KeyStore.java:1185)
少しグーグルを行った後、使用しているパスワードが間違っていると思われますが、それらが正しいことを確認した後でもエラーが発生します。ここで、キーストア データを読み込もうとしています。
public class AegisDataStoreFactory {
...
static {
InputStream in = null;
try{
final Configuration conf = Configuration.getConfiguration();
final KeyStore ks = KeyStore.getInstance("JCEKS");
in = AegisDataStoreFactory.class.getResourceAsStream(KEYSTORE);
final String password = conf.getProp("keyStorePassword").trim();
ks.load(in, password.toCharArray());
...
} finally {
if(in != null) {
in.close();
}
}
}
...
}
プログラムはロード時に IOException で失敗します。私はここで途方に暮れています。戦争中にロードしていないときは問題なく動作します。私は Maven を使用して war ファイルを生成しています。
何かご意見は?
編集:何が起こっているのか理解しました。ビルドに Maven を使用し、ビルド中にリソース ファイルのフィルタリングを有効にしました。この時点まで、リソース ディレクトリにバイナリ ファイルはありませんでした (フィルタリングを有効にしたいいくつかのプロパティ ファイルしかありませんでした)。キーストアをフィルタリングから除外しても、キーストアが移動されたことを確認すると、機能しました。