2

我有一个 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 生成战争文件。

有什么想法吗?

编辑:我知道发生了什么。我使用 Maven 进行构建,并且在构建期间我为资源文件启用了过滤。到目前为止,我的资源目录中没有任何二进制文件(我只有一些我想要过滤的属性文件)。一旦我从过滤中排除了密钥库,但仍确保密钥库已移动,它就可以工作了。

4

1 回答 1

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>
于 2012-04-17T03:31:35.547 回答