在JVM信任库中列出证书

时间:2012-01-16 18:49:35

标签: java ssl truststore

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

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

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

1 个答案:

答案 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);

这与TrustManagerFactorytmf.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