无法从类路径加载jks文件

时间:2014-02-28 19:57:23

标签: classpath encryption java-8 jks

我用公共和私有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和完整路径。 我做错了什么?

2 个答案:

答案 0 :(得分:5)

一般来说,您的解决方案应该暂时有效。

这些规定是什么?确保您的资源文件夹位于类路径中。如果您不确定,请在执行程序时将其添加到传递给-cp的{​​{1}}标志,或者如果您使用的是Eclipse或其他IDE,请确保将其列为成员该项目的类路径。

接下来,check out this stackoverflow that relates to your question。虽然您使用类的getResourceAsStream()方法的方式是有效的(包括文件名开头的java导致类资源加载器遵从ClassLoader的方法),但直接使用ClassLoader可能不那么令人困惑。 Another good example is found here

首先,检查您的资源文件夹是否明确属于类路径。其次,更喜欢以下结构来寻找资源:

/

请注意文件名中缺少的InputStream stream= this.class.getClassLoader().getResourceAsStream("lutum.jks"); 。这是因为ClassLoader将自动开始在“项目根目录”进行搜索,而斜杠可能只会导致问题(例如,如果部署到JBoss或Tomcat,则可能会被类加载器解释为绝对文件系统路径相对路径)。

我希望这会有所帮助。如果没有,请给我评论你项目的更多细节,我会相应地改变我的答案。

答案 1 :(得分: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 ...
    }