【问题标题】:How does one correctly create and access a KeyStore in java to store an encryption key?如何在 Java 中正确创建和访问 KeyStore 以存储加密密钥?
【发布时间】:2015-09-17 23:19:01
【问题描述】:

我一直在混合和匹配代码,尝试通过示例学习如何使用 KeyStore。

我有这个 createKeyStore 方法:

private static KeyStore createKeyStore(String fileName, String pw) throws Exception
    {
        File file = new File(fileName);

        final KeyStore keyStore = KeyStore.getInstance("JCEKS");
        if (file.exists())
        {
            // .keystore file already exists => load it
            keyStore.load(new FileInputStream(file), pw.toCharArray());
        }
        else
        {
            // .keystore file not created yet => create it
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream(fileName), pw.toCharArray());
        }

        return keyStore;
    }`

它似乎工作,没有抛出任何错误。

然后我尝试通过以下方式访问代码:

KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    keystore.load(new FileInputStream(keystorePath), pass.toCharArray());

    String alias = "alias";
    char[] password = pass.toCharArray();

    Certificate cert = keystore.getCertificate(alias);
    keystore.setCertificateEntry(alias, cert);

    // Save the new keystore contents
    FileOutputStream out = new FileOutputStream(keystoreFile);
    keystore.store(out, password);
    out.close();

但是我对 keystore.load 的调用会引发 Invalid Keystore Format 异常。 我尝试将 FileInputStream 替换为 null,但设置证书似乎会引发错误。

TL;DR:我只是想在这个密钥库中存储一些加密密钥,但我似乎无法正确访问它。

感谢阅读!

【问题讨论】:

    标签: java exception exception-handling keystore


    【解决方案1】:

    你有:

    final KeyStore keyStore = KeyStore.getInstance("JCEKS");
    

    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    

    改变这些,让他们同意。

    这个:

    Certificate cert = keystore.getCertificate(alias);
    keystore.setCertificateEntry(alias, cert);
    

    毫无意义。如果密钥库中没有这样的证书,它将失败,如果有,它将用自己替换它。究竟有什么意义?

    我尝试将 FileInputStream 替换为 null

    我无法想象为什么。 Javadoc 中没有任何内容表明它会起作用。

    【讨论】:

    • 这肯定改变了一些东西。在 create keystore 方法中,对 keystore.load 的调用现在会抛出 EOFException。
    • 在第一段代码中创建密钥库后,您并没有关闭FileOutputStream
    • 我现在不是 100% 确定。我删除了 Certificate 行,并尝试声明 FileINputStream 而不是原始方式,以便可以关闭它。但它仍然会抛出 EOFException。
    • 为我工作。您必须向我们展示您当前的代码。将其编辑到您的问题中。还有堆栈跟踪。
    • 奇怪。我会抹去我所拥有的一切以及它创造的一切,然后回复你。谢谢
    【解决方案2】:

    如果您查看文档,它说创建一个空的密钥库调用 load() 方法,其中 null 作为文件输入参数,而不是密码参数。在 else 子句中将 null 作为密码参数传递会导致稍后从文件加载密钥库时出现空指针异常。

    keystore.load(null, pass.toCharArray());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2019-08-11
      • 1970-01-01
      • 2011-03-03
      • 2015-02-17
      • 2020-09-05
      相关资源
      最近更新 更多