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

3
我正在处理一个问题,与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());
}
然而,如果我不提供密码(即从keytool调用中删除storepass参数并在提示时键入返回,或在Java代码中将null作为第二个参数调用load),则不会列出任何条目。 keytool提供警告,但不列出任何条目。 现在,如果我使用portecle或kse以相同的方式生成信任存储并导入证书,设置密码,并在不提供密码的情况下再次运行检查,则myAlias仍将被列为条目(keytool按预期显示警告,但也显示证书)。

我对此问题的理解是,在读取信任存储区的内容时,密码不太相关(没有进行太多调查,因此我也假设这就是为什么TrustManagerFactory#init不需要密码,与KeyManagerFactory#init相反)。

我的问题

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

我已经使用以下keytool复制了此行为:

  • Oracle JDK 11(甲骨文JDK 11)
  • Oracle JDK 12(甲骨文JDK 12)
  • OpenJDK11(开放式JDK 11)

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

JKS密钥库使用专有格式。建议迁移到PKCS12,这是一种使用“keytool -importkeystore -srckeystore ./ora8_keystore.jks -destkeystore ./ora8_keystore.jks -deststoretype pkcs12”命令的行业标准格式。

此外,使用来自Oracle JDK8的keytool生成的信任库进行SSL握手似乎会永远挂起,没有失败的痕迹。

在调试Java代码时,我注意到无论使用哪个工具和JDK(包括Oracle JDK8)生成的信任存储区最终都通过工厂初始化为双格式密钥库,而不管使用了哪个工厂参数(jks),即密钥库对象是sun.security.provider.JavaKeyStore$DualFormatJKS类的,具有spi,其primaryType = JKSsecondaryType = PCKS12。最后一部分并没有真正帮助我理解,但它可能在某种程度上是相关的。

这并不是我20年的经验。 - user207421
@user207421,复制应该很简单。你尝试过具体的情况吗? - Mena
正如我之前所说,我已经从事这些工作20多年了。如果不提供密码,您将无法访问私钥,并且无法验证密钥库结构。 - user207421
@user207421,是的,这就是我期望它工作的方式。然而,当使用keytool list或以编程方式创建信任存储并使用keytool导入证书时,至少在Java 11及以上版本中,我仍然可以复制“缺少条目”的部分。 - Mena
我有类似的问题,请告诉我你是否找到了答案。我的问题只是其中一个信任存储库在没有密码的情况下未列出其中所有证书。当我使用正确的密码列出它时,它会正确地列出内容。 - Amit S
显示剩余5条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,