在JVM信任库中列出证书

5

我已经通过系统属性定义了一个自定义的信任存储库:

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

考虑到虚拟机已经负责加载文件,我想列出那些已经被加载的证书。我不想再次将信任库加载到流中并从那里获取证书,而是想要查看虚拟机自己加载的证书。此外,我想从我的应用程序内部查看这些证书,而不使用单独的工具。我已经做了一些谷歌搜索,但到目前为止还没有找到。


你尝试过使用keytool -list选项吗? - kosa
@thinksteep:那需要使用一个单独的工具。 - Carlos
1个回答

10
当JSSE使用这些设置构建其默认的X509TrustManager时(覆盖JRE默认设置),但在JSSE架构中,默认信任管理器原则上不需要从密钥库中构建,因此JSSE API中没有任何内容可以访问用于构建默认信任管理器的密钥库。
如果您想要读取通过javax.net.ssl.trustStore*属性传递的信任存储的内容,则必须自己打开文件。
您可以获得的最接近的东西将是使用默认的TrustManagerFactory获取默认的X509TrustManager
编辑:有关更多详细信息,请查看OpenJDK中的实现。
sun.security.ssl.DefaultSSLContextImpl中的逻辑(不是公共API的一部分)是使用从TrustManagerFactoryImpl获得的KeyStore来初始化TrustManagerFactory(这也不是公共API的一部分)。
KeyStore ks = TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);

这与使用tmf.init(null)TrustManagerFactory的行为一致。这也依赖于默认密钥库,但在公共API中有记录。 实际上,实现(使用tmf.init(null))最终做了相同的事情,如TrustManagerFactoryImpl所示(当密钥库参数为null时,engineInit也调用getCacertsKeyStore)。
在这两种情况下,KeyStore变量都未存储在类成员中,它只是一个本地变量,在使用这些初始化方法后无法访问。

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

编辑 2:

如果您想要的东西通常可以工作,但不能保证工作,这个答案 应该会有所帮助。请注意,默认的信任存储并不一定是 cacerts


令人难以置信,这个可行。我从TrustManagerFactoryImpl中复制了getCacertsKeyStore的代码,并使用“defaultctx”进行了调用。谢谢! - Afforess

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