2012-01-16 95 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