JCEKS密钥库作为战争资源

时间:2012-04-16 18:39:57

标签: java maven war keystore

我有一个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进行构建,在构建过程中,我为资源文件启用了过滤功能。到目前为止,我的资源目录中没有任何二进制文件(我只有一些我希望进行过滤的属性文件)。一旦我从过滤中排除了密钥库,但仍然确保密钥库已被移动,它就可以工作。

1 个答案:

答案 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>