如何正确地在Java中创建和访问KeyStore来存储加密密钥?

问题描述 投票:0回答:2

我一直在混合和匹配代码,尝试通过示例学习如何使用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的调用引发了无效的Keystore Format异常。我尝试将FileInputStream替换为null,但设置证书似乎引发错误。

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

感谢阅读!

java exception exception-handling keystore
2个回答
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中没有任何东西表明可以使用。


0
投票

[如果您查看文档,它说要创建一个空的密钥库,请调用load方法,并将null作为文件输入参数。稍后从文件加载密钥库时,在else子句中将null作为password参数传递会导致null指针异常。

keystore.load(null, pass.toCharArray());
© www.soinside.com 2019 - 2024. All rights reserved.