簡體   English   中英

在JVM信任庫中列出證書

[英]Listing certificates in JVM trust store

我已經通過系統屬性定義了一個自定義信任庫:

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

鑒於VM已經負責加載文件,我想列出那些已加載的證書。 我不想再次將信任庫加載到流中並從那里獲取證書,而是希望看到VM已經自己加載的那些。 另外,我想在我自己的應用程序中看到它們,而不是使用單獨的工具。 我做了一些谷歌搜索,但到目前為止,我一直無法找到這個。

當它們被使用時,JSSE使用這些設置來構建其默認的X509TrustManager (覆蓋JRE默認值)。 但是,JSSE API中沒有任何內容可以訪問構建缺省信任管理器的密鑰庫,因為在JSSE體系結構中,原則上不需要從密鑰庫構建缺省信任管理器。

如果要讀取通過javax.net.ssl.trustStore*屬性傳遞的信任庫的內容,則必須自己打開該文件。

你能得到的最接近的東西是使用默認的TrustManagerFactory的默認X509TrustManager

編輯:

有關更多詳細信息,您可以查看OpenJDK中的實現。

在邏輯sun.security.ssl.DefaultSSLContextImpl (未公共API的一部分)是初始化TrustManagerFactoryKeyStore從所獲得的TrustManagerFactoryImpl (其不是用於公共API部分要么):

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

這與TrustManagerFactorytmf.init(null)的行為一致。 這也依賴於默認密鑰庫,但這在公共API中有記錄。 實際上,實現(使用tmf.init(null) )最終會執行相同的操作,如TrustManagerFactoryImpl所示(當keystore參數為null時, engineInit也會調用getCacertsKeyStore )。

在這兩種情況下, KeyStore變量都不存儲在類成員中,它只是在使用這些初始化方法后無法訪問的局部變量。

生成的X509TrustManagerImpl確實包含可信證書列表,但(a) trustedCerts是私有成員,(b)這些都不是JSSE的公共API的一部分。

編輯2:

如果你想要的東西大部分時間都可能有效,但不能保證有效, 這個答案應該有所幫助。 請注意, 默認信任庫不一定是cacerts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM