2012-01-16 96 views
4

我通过系统属性定义的自定义信任:上市证书

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

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

+0

没有尝试的keytool -list选项? – kosa 2012-01-16 19:21:23

+0

@thinksteep:那将使用一个单独的工具 – Carlos 2012-01-16 19:42:22

回答

7

当他们使用,JSSE使用这些设置来构建其默认X509TrustManager(重写JRE默认)。然而,没有什么的JSSE API中获取与由于默认的信任管理器是建立密钥库,在JSSE架构,默认的信任管理需求不能从原则上密钥库建成。

如果你想读通过javax.net.ssl.trustStore*性能顺利通过了信任存储的内容,你必须自己打开该文件。

你可以弄个最接近的将是使用默认TrustManagerFactory默认X509TrustManager

编辑:

有关详细信息,你可以看看在OpenJDK的实施。

sun.security.ssl.DefaultSSLContextImpl(未公共API的一部分)的逻辑是初始化TrustManagerFactory与来自TrustManagerFactoryImpl获得(其不是用于公共API部分要么)一个KeyStore

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

这是一致其行为TrustManagerFactorytmf.init(null)。这也将依赖于默认的密钥库,但是这在公共API中有记录。 实际上,执行(与tmf.init(null))结束时也是如此,如TrustManagerFactoryImplengineInit也在keystore参数为空时调用getCacertsKeyStore)所示。

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

所得X509TrustManagerImpl确实包含可信证书的列表,但(一)trustedCerts是一个私有成员和(b)这一切都不是JSSE的公共API的一部分。

编辑2:

如果你想要的东西,可能是工作的大部分时间,但不保证工作,this answer应该有所帮助。请注意,the default trust store isn't necessarily cacerts

+0

令人难以置信的是,这个工程。我从TrustManagerFactoryImpl中的getCacertsKeyStore复制代码,并用“defaultctx”调用它。谢谢! – Afforess 2013-02-16 02:14:43