2008-11-25 49 views

回答

233

密鑰庫包含私鑰和證書及其相應的公鑰。

信任庫包含您期望與之通信的其他方的證書,或來自您信任的證書頒發機構以識別其他方的證書。

+10

雖然這應該在實踐中是真實的,他們可以(並且經常是)一個人。實際上,您可以將私鑰和公共證書導入[java home]/jre/lib/security/cacerts默認的「信任庫」。 keytool實用程序在兩個術語中沒有區別,僅在商店類型中(即 - JKS vs. PKCS12)。對於這個問題,Java在源代碼中做了同樣的事情。您創建一個java.security.KeyStore,並使用信任管理器來管理其中的證書,但沒有TrustStore類。 – 2013-09-05 17:19:05

+4

Java本身沒有`TrustStore` *。或者我無法在java文檔中找到它(例如`java.security.TrustStore`)。當我們想要信任一個證書頒發機構時,它通過`KeyStore`被信任(並且`KeyStore`被傳遞給`TrustManagerFactory`)。 – jww 2014-03-24 21:16:46

+5

值得一提的是,`KeyStore.load(InputStream是,char [] password)`([docs](http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html #load%28java.io.InputStream,%20char []%29))可以接受一個空密碼,然後它將訪問公共證書。也就是說,想要瀏覽信任庫的代碼不需要知道它的密碼(出於很好的理由!) – xverges 2015-01-26 17:42:01

70
  1. 密鑰庫包含私鑰。如果您是服務器的 ,或者服務器需要客戶端身份驗證,則只需要此設置。

  2. 信任庫包含要信任的CA證書。如果您的服務器的 證書由公認的CA簽署,則JRE附帶的默認信任庫 已經信任它(因爲它已經對 信任可信的CA),因此您無需構建自己的, 或添加來自JRE的任何東西。

Source

60

在SSL握手的目的的trustStore是驗證憑證密鑰庫的目的是提供憑證

的keyStore

的keyStore在Java中存儲專用密鑰和對應於它們的公鑰證書,並要求,如果你是SSL服務器或SSL需要客戶端身份驗證。

信任庫

信任庫存儲從第三方證書,Java應用程序通信,或者能夠用於識別第三方通過CA簽名證書(證書頒發機構如Verisign,Thawte安全後,GeoTrust或GoDaddy)。

的TrustManager

的TrustManager確定遠程連接是否應該信任與否即對方是否是其宣稱和的KeyManager決定哪些認證證書應該被髮送到SSL握手期間遠程主機進行身份驗證誰。

如果您是SSL服務器,您將在密鑰交換算法期間使用私鑰並將與您的公鑰對應的證書發送給客戶端,此證書是從keyStore獲取的。在SSL客戶端,如果使用Java編寫,它將使用存儲在trustStore中的證書來驗證服務器的身份。SSL證書通常是.cer文件,通過使用任何密鑰管理實用程序將其添加到keyStore或trustStore中。 keytool

來源:http://javarevisited.blogspot.ch

9

在Java中,什麼是一個密鑰庫和一個信任的區別?

下面是關於Java Secure Socket Extension (JSSE) Reference Guide的Java文檔的描述。我認爲它不會告訴你與別人所說的不同之處。但它確實提供了官方參考。

密鑰庫/信任

密鑰庫是鍵材料的數據庫。密鑰材料用於多種用途,包括認證和數據完整性。 各種類型的密鑰庫都可用,包括PKCS12和 Oracle的JKS。

一般來說,密鑰庫信息可以分爲兩類:密鑰條目和可信證書條目。密鑰條目 由實體的身份和其私鑰組成,並且可以用於各種加密目的的 。相比之下,除了 實體的身份之外,可信的 證書條目僅包含公鑰。因此,不能使用受信任的證書條目 ,其中需要私鑰,例如在javax.net.ssl.KeyManager中使用 。在JKS的JDK實現中,密鑰庫 可能包含密鑰條目和可信證書條目。

信任庫是一個密鑰庫,用於決定要信任的內容。如果您收到來自您已信任的實體的數據,並且如果您可以驗證該實體是其聲稱的那個實體,那麼您可以假設數據確實來自該實體的 。

如果用戶信任該實體,則只應將條目添加到信任庫。通過生成密鑰對或通過導入證書,用戶對該條目給予信任。 信任庫中的任何條目都被視爲可信條目。

有兩個不同的密鑰庫文件可能會很有用:一個只包含您的密鑰條目,另一個包含您的可信證書條目(包括CA證書)。前者 包含私人信息,而後者則不包含。使用兩個 文件而不是單個密鑰庫文件提供了您自己的證書(和對應的私鑰)和其他證書之間的邏輯區分的更清晰的分隔 。要爲您的私鑰提供更多 保護,請將其存儲在具有 受限訪問權限的密鑰庫中,並在需要時在更公開訪問的密鑰庫中提供可信證書。

3
  1. 第一和信任存儲用於keyStore之間主要的區別是,的trustStore用於通過的TrustManager確定遠程連接是否應被信任,密鑰庫從的KeyManager決定哪些認證證書應當被髮送到遠程主機所使用SSL握手期間的身份驗證。

  2. 另一個區別在於,理論上,keyStore只包含在SSL連接中運行服務器時所需的私鑰,或者您已在服務器端啓用了客戶端身份驗證,另一方面,trustStore存儲來自CA(證書頒發機構)用於信任遠程方或SSL連接。

    事實上,你可以在同一文件中同時存儲私鑰和公​​鑰, 鑑於管理這些文件的工具是一樣的(密鑰工具), 所以你可以使用一個單獨的文件同時爲目的,但你 可能不應該

  3. 至少在我的Mac OSX上,默認的keyStore是${user.home}/.keystore,默認的trustStore是/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

    如果您想覆蓋它們,您應該添加JVM參數 -Djavax.net.ssl.keyStore /path/to/keyStore-Djavax.net.ssl.trustStore /path/to/trustStore。您可能還 需要設置的 java.security.UnrecoverableKeyException: Password must not be null情況下,存儲密碼,使用參數 -Djavax.net.ssl.trustStorePassword=password-Djavax.net.ssl.trustStorePassword=password

主要來源:

http://javarevisited.blogspot.co.uk/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html