如果没有提供密码,则使用keytool创建的受密码保护的信任库将不显示任何条目

时间:2019-04-02 15:45:16

标签: java keytool truststore

我在keytool创建密钥库(在此处用作信任库)和导入受信任证书的方式与其他工具(例如porteclekse ) 照着做。

考虑此命令:

keytool -import -alias myAlias -file ./my_exported_server_cert.crt \
-keystore ./my_truststore.jks

这将提示我输入密码,然后创建包含证书的my_truststore.jks

现在,如果我查看内部并提供正确的密码,将列出myAlias条目:

keytool -v -list -keystore ./my_truststore.jks -storeType jks -storepass myPass

或者,以编程方式...

try (InputStream is = new FileInputStream(new File("./my_truststore.jks"))) {
    KeyStore keyStore = KeyStore.getInstance("jks");
    keyStore.load(is, "myPassword".toCharArray());
    Iterator<String> it = keyStore.aliases().asIterator();
    while (it.hasNext()) System.out.println(it.next());
}

但是,如果我提供密码(例如,从storepass调用中删除keytool参数,并在出现提示时键入return,或调用{{1} },其中load是Java代码中的第二个参数),没有列出任何条目。

null提供警告,但未列出任何条目。

现在,如果我使用portecle或kse以相同的方式生成信任库并导入证书,设置密码,然后在不提供密码的情况下再次运行检查,则keytool仍会列为条目({ {1}}会按预期显示警告,但也会显示证书。

我对此事的有争议的理解是,密码与信任库中的内容 read 的相关性较小(我不作过多调查也认为这就是为什么TrustManagerFactory#init不使用密码,与KeyManagerFactory#init相反)。

我的问题

  • 行为差异的原因是什么?这些工具不是在幕后使用与myAlias相同的核心API吗?
  • 是否有一种方法可以对keytool进行参数化设置,以生成一个信任存储,该信任存储可以像其他工具一样在无密码查询时允许读取条目的可见性?

注释

我从以下位置用keytool复制了此行为:

  • Oracle JDK 11
  • Oracle JDK 12
  • OpenJDK11

在Oracle JDK8中使用keytool进行测试时,我注意到找到了该条目,尽管最初在服务器端创建密钥库并导出一个证书时会收到警告:

  

JKS密钥库使用专有格式。推荐给   使用“ keytool”迁移到行业标准格式PKCS12   -importkeystore -srckeystore ./ora8_keystore.jks -destkeystore ./ora8_keystore.jks -deststoretype pkcs12“

此外,使用由Oracle JDK8的keytool生成的信任库进行的SSL握手似乎可以永久挂起而没有失败的痕迹。

在调试我的Java代码时,我注意到无论使用哪种工厂参数(keytool,这两个工具和任何一个JDK(包括Oracle JDK8)生成的信任库最终都通过工厂初始化为双重格式密钥存储。 ,即密钥库对象属于keytool类,其spi具有jkssun.security.provider.JavaKeyStore$DualFormatJKS

最后一点并不能真正帮助我理解,但可能与某种意义相关。

1 个答案:

答案 0 :(得分:0)

这个问题最好在open JDK bug中描述 https://bugs.openjdk.java.net/browse/JDK-8194702。 我们还没有解决此问题的方法。