在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);
这与TrustManagerFactory
与tmf.init(null)
的行为一致。 这也依赖于默认密钥库,但这在公共API中有记录。 实际上,实现(使用tmf.init(null)
)最终会执行相同的操作,如TrustManagerFactoryImpl
所示(当keystore参数为null时, engineInit
也会调用getCacertsKeyStore
)。
在这两种情况下, KeyStore
变量都不存储在类成员中,它只是在使用这些初始化方法后无法访问的局部变量。
生成的X509TrustManagerImpl
确实包含受信任证书列表,但(a) trustedCerts
是私有成员,(b)这些都不是JSSE的公共API的一部分。
编辑2:
如果你想要的东西大部分时间都可能有效,但不能保证有效, 这个答案应该有所帮助。 请注意, 默认信任存储不一定是cacerts
。