[英]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的一部分)是初始化TrustManagerFactory
用KeyStore
從所獲得的TrustManagerFactoryImpl
(其不是用於公共API部分要么):
KeyStore ks = TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
這與TrustManagerFactory
與tmf.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.