我已经通过系统属性定义了一个自定义信任库:
System.setProperty("javax.net.ssl.trustStore", ...);
System.setProperty("javax.net.ssl.trustStorePassword", ...);
鉴于VM已经负责加载文件,我想列出那些已加载的证书。我不想再次将信任库加载到流中并从那里获取证书,而是希望看到VM已经自己加载的那些。另外,我想在我自己的应用程序中看到它们,而不是使用单独的工具。我做了一些谷歌搜索,但到目前为止,我一直无法找到它。
答案 0 :(得分:9)
当它们被使用时,JSSE使用这些设置来构建其默认的X509TrustManager
(覆盖JRE默认值)。但是,JSSE API中没有任何内容可以访问构建缺省信任管理器的密钥库,因为在JSSE体系结构中,原则上不需要从密钥库构建缺省信任管理器。
如果要阅读通过javax.net.ssl.trustStore*
属性传递的信任库的内容,则必须自己打开文件。
您可以使用默认X509TrustManager
获得最接近的默认TrustManagerFactory
。
修改强>
有关更多详细信息,您可以查看OpenJDK中的实现。
sun.security.ssl.DefaultSSLContextImpl
中的逻辑(不是公共API的一部分)是使用从TrustManagerFactory
获取的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
所示(engineInit
当keystore参数为null时也调用getCacertsKeyStore
。
在这两种情况下,KeyStore
变量都不存储在类成员中,它只是使用这些初始化方法后无法访问的局部变量。
生成的X509TrustManagerImpl
确实包含受信任证书列表,但(a)trustedCerts
是私有成员,(b)这些都不是JSSE公共API的一部分。< / p>
编辑2:
如果您想要的东西大部分时间都可以使用,但不能保证可以正常工作,this answer应该有所帮助。请注意the default trust store isn't necessarily cacerts
。