Java 在JVM信任存储中列出证书

Java 在JVM信任存储中列出证书,java,ssl,truststore,Java,Ssl,Truststore,我已通过系统属性定义了自定义信任库: System.setProperty("javax.net.ssl.trustStore", ...); System.setProperty("javax.net.ssl.trustStorePassword", ...); 鉴于VM已经负责加载文件,我想列出已加载的证书。我不想再次将信任库加载到流中并从中获取证书,而是希望看到VM已经自己加载的证书。此外,我希望从我自己的应用程序中看到它们,而不是使用单独的工具。我用谷歌搜索了一下,但到目前为止我还找不

我已通过系统属性定义了自定义信任库:

System.setProperty("javax.net.ssl.trustStore", ...);
System.setProperty("javax.net.ssl.trustStorePassword", ...);

鉴于VM已经负责加载文件,我想列出已加载的证书。我不想再次将信任库加载到流中并从中获取证书,而是希望看到VM已经自己加载的证书。此外,我希望从我自己的应用程序中看到它们,而不是使用单独的工具。我用谷歌搜索了一下,但到目前为止我还找不到这个。当使用这些设置时,JSSE使用这些设置来构建其默认的
X509TrustManager
(覆盖JRE默认设置)。但是,JSSE API中没有任何内容可以访问用于构建默认信任管理器的密钥库,因为在JSSE体系结构中,默认信任管理器原则上不需要从密钥库构建

如果您想读取通过
javax.net.ssl.trustStore*
属性传递的信任存储的内容,您必须自己打开该文件

使用默认的信任管理器工厂,您可以获得的最接近的东西将是默认的
X509TrustManager

编辑:

有关更多详细信息,您可以查看OpenJDK中的实现

中的逻辑(不是公共API的一部分)是使用从
TrustManagerFactoryImpl
获取的
密钥库来初始化
TrustManagerFactory
(也不是公共API的一部分):

这与with
tmf.init(null)
的行为一致。这也将依赖于默认密钥库,但这在公共API中有记录。 实际上,实现(使用
tmf.init(null)
)也会完成相同的操作,如(
engineInit
在密钥库参数为null时也会调用
getCacertsKeyStore

在这两种情况下,
KeyStore
变量不存储在类成员中,它只是一个局部变量,在使用这些初始化方法后无法访问

结果确实包含受信任证书的列表,但是(a)
trustedCerts
是私有成员,并且(b)这些都不是JSSE的公共API的一部分

编辑2:


如果你想要的东西可能在大多数时间都有效,但不能保证有效,那就应该有所帮助。请注意。

您是否尝试了keytool-list选项?@ThinkStiple:这将使用一个单独的工具。难以置信的是,这很有效。我从TrustManagerFactoryImpl中的getCacertsKeyStore复制了代码,并用“defaultctx”调用了它。谢谢
KeyStore ks = TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);