在JVM信任库中列出证书

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

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

鉴于VM已经负责加载文件,我想列出那些已加载的证书。 我不想再次将信任库加载到流中并从那里获取证书,而是希望看到VM已经自己加载的那些。 另外,我希望从我自己的应用程序中看到它们,而不是使用单独的工具。 我做了一些谷歌搜索,但到目前为止,我一直无法找到这个。

当它们被使用时,JSSE使用这些设置来构建其默认的X509TrustManager (覆盖JRE默认值)。 但是,JSSE API中没有任何内容可以访问构建缺省信任管理器的密钥库,因为在JSSE体系结构中,原则上不需要从密钥库构建缺省信任管理器。

如果要读取通过javax.net.ssl.trustStore*属性传递的信任库的内容,则必须自己打开该文件。

您最接近的将是使用默认TrustManagerFactory的默认X509TrustManager

编辑:

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

sun.security.ssl.DefaultSSLContextImpl (不是公共API的一部分)中的逻辑是使用从TrustManagerFactoryImpl获取的KeyStore初始化TrustManagerFactoryImpl (也不是公共API的一部分):

 KeyStore ks = TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx"); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); 

这与TrustManagerFactorytmf.init(null)的行为一致。 这也依赖于默认密钥库,但这在公共API中有记录。 实际上,实现(使用tmf.init(null) )最终会执行相同的操作,如TrustManagerFactoryImpl所示(当keystore参数为null时, engineInit也会调用getCacertsKeyStore )。

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

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

编辑2:

如果你想要的东西大部分时间都可能有效,但不能保证有效, 这个答案应该有所帮助。 请注意, 默认信任存储不一定是cacerts