我有一个JCEKS密钥库,我从war文件作为资源加载。我正在使用密钥库来存储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进行构建,在构建过程中,我为资源文件启用了过滤功能。到目前为止,我的资源目录中没有任何二进制文件(我只有一些我希望进行过滤的属性文件)。一旦我从过滤中排除了密钥库,但仍然确保密钥库已被移动,它就可以工作。
答案 0 :(得分:1)
我弄清楚发生了什么。我使用Maven进行构建,在构建过程中,我为资源文件启用了过滤功能。到目前为止,我的资源目录中没有任何二进制文件(我只有一些我希望进行过滤的属性文件)。一旦我从过滤中排除了密钥库,但仍然确保密钥库已被移动,它就可以工作了。这是我最初的pom文件:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
这是我更新我的pom文件的内容。 (我的密钥库的文件扩展名为.ks)
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.ks</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.ks</include>
</includes>
</resource>
</resources>