在JVM信任库中列出证书

Car*_*los 5 java ssl truststore

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

System.setProperty("javax.net.ssl.trustStore", ...);
System.setProperty("javax.net.ssl.trustStorePassword", ...);
Run Code Online (Sandbox Code Playgroud)

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

Bru*_*uno 10

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

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

您可以获得的最接近的东西是X509TrustManager使用默认值的默认值TrustManagerFactory.

编辑:

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

在逻辑sun.security.ssl.DefaultSSLContextImpl(未公共API的一部分)是初始化TrustManagerFactoryKeyStore从所获得的TrustManagerFactoryImpl(这是不为公众API部分要么):

KeyStore ks = TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
Run Code Online (Sandbox Code Playgroud)

这与一致的行为TrustManagerFactorytmf.init(null).这也依赖于默认密钥库,但这在公共API中有记录.实际上,实现(with tmf.init(null))最终会做同样的事情,如TrustManagerFactoryImpl(在keystore参数为null时engineInit调用getCacertsKeyStore).

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

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

编辑2:

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