2011-06-14 43 views
171

我知道密鑰庫通常會保存私鑰/公鑰和只有信任存儲公鑰(並且代表您希望與之通信的可信方的列表)。那麼,這是我的第一個假設,所以如果這是不正確的,我可能還沒有開始很好......Trust Store vs Key Store - 使用keytool創建

我很感興趣,但在理解使用keytool時如何區分商店。

所以,到目前爲止,我已經創建了使用

keytool -import -alias bob -file bob.crt -keystore keystore.ks 

它創建我的keystore.ks文件密鑰庫。我回答yes這個問題我相信鮑勃,但我不清楚這是否創建了一個密鑰庫文件或一個信任庫文件?我可以將我的應用程序設置爲使用該文件。

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x 
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x 

System.setProperty("javax.net.debug", "ssl")集,我可以看到在信任的認證證書(而不是根據密鑰庫部分)。我正在導入的特定證書只有一個公鑰,我打算使用它通過SSL連接將內容發送給Bob(但也許最好留給其他問題!)。

任何指針或澄清將不勝感激。 keytool的輸出是否與您導入的輸出相同,並且它的公約規定一個是密鑰庫,另一個是信任庫?使用SSL等什麼關係?

+0

我不確定你的意思是「我正在導入的特定證書只有一個公鑰」:它只是公鑰(即不是證書)還是非CA證書? – Bruno 2011-06-14 09:27:53

+0

嗯,不確定。我從瀏覽器中導出爲PEM文件。這有幫助嗎? – Toby 2011-06-14 09:31:38

+0

如果從瀏覽器導出它,它可能是一個證書。它是一個服務器證書(CN或subjectAltName與服務器的名稱匹配)?它是一個CA證書嗎?(在Basic Constraints下查看,您應該能夠使用瀏覽器查看此證書)。 – Bruno 2011-06-14 09:36:59

回答

236

的確,術語確實有點令人困惑,但爲了兩個不同的目的,javax.net.ssl.keyStorejavax.net.ssl.trustStore都用於指定要使用哪些密鑰庫。密鑰庫以各種格式出現,甚至不一定是文件(請參閱this question),而keytool只是對其執行各種操作(導入/導出/列表/ ...)的工具。

javax.net.ssl.keyStorejavax.net.ssl.trustStore參數是用於構建KeyManager S和TrustManager S(分別)的默認參數,然後用於構建SSLContext其基本上包含SSL/TLS設置,以製備SSL經由/ TLS連接時使用SSLSocketFactorySSLEngine。這些系統屬性就是默認值來自的地方,然後由SSLContext.getDefault()使用,其本身例如由SSLSocketFactory.getDefault()使用。 (所有這一切都可以通過API在一些地方進行自定義,如果你不想使用默認值和特定SSLContext■對於給定的目的。)

KeyManagerTrustManager之間的差異(因此和javax.net.ssl.trustStore之間javax.net.ssl.keyStore)如下(從JSSE ref guide引述):

的TrustManager:確定是否 遠程認證憑證(和 因此連接)應當 可信。

KeyManager:確定將哪個 認證憑證發送到 遠程主機。

(其它參數可與它們的默認值在JSSE ref guide描述。請注意,雖然有對信任存儲的默認值,沒有一個密鑰存儲。)

本質,javax.net.ssl.keyStore中的密鑰庫旨在包含您的私鑰和證書,而javax.net.ssl.trustStore旨在包含您在遠程方出示其證書時願意信任的CA證書。在某些情況下,它們可以是同一個商店,但使用不同商店通常更好(尤其是基於文件的商店)。

+0

感謝您的回覆,它清除了一些事情。我仍然感到困惑,但在使用時,我可以使用pk12 pri/pub密鑰(xxx.p12)作爲密鑰庫(通過-D)並創建一個SSL連接(可信),而不必提及任何信任庫 - D ...哦,好。 – Toby 2011-06-15 08:03:07

+32

您不需要指定信任庫,因爲它有一個默認值(它與JRE捆綁在一起),通常位於'$ JAVA_HOME/lib/security/cacerts'中(請參閱我發送的第二個JSSE參考指南鏈接)。像瀏覽器一樣,它包含一組默認的可信CA證書。通常,客戶端總是使用信任庫來檢查服務器證書,但密鑰庫僅在服務器請求客戶端證書時使用,並且服務器始終將密鑰庫用於其自己的密鑰+證書,但信任庫僅會在客戶端發送客戶端證書時使用。 – Bruno 2011-06-15 09:09:10

+2

感謝您提供有用的信息。在Weblogic中,有「identity-key-store」存儲服務器的SSL證書,然後是存儲服務器信任的SSL證書的「trust-key-store」,所以我正確地說,如果我說「identity-key 「存儲」只不過是一個「密鑰存儲」而「信任密鑰存儲」只不過是一個「信任存儲」? – hagrawal 2017-02-13 15:51:53

20

密鑰庫和信任庫文件沒有區別。兩者都是專有的JKS文件格式的文件。區別在於:據我所知,在創建SSL連接時,Java只會使用javax.net.ssl.trustStore引用的存儲來查找要信任的證書。鍵和javax.net.ssl.keyStore一樣。但從理論上講,使用同一個文件進行信任和密鑰存儲是很好的做法。

+4

您可以通過設置'javax.net.ssl.keyStoreType'和'javax.net.ssl.trustStoreType'系統屬性來使用不同類型的密鑰庫(例如PKCS12)。 – 2011-06-14 08:53:08

+1

@Donal:好的補充。你碰巧知道是否有所有支持的容器列表?我只知道PKCS12和JKS(前者是反覆試驗的結果......)。 – musiKk 2011-06-14 09:01:42

+2

密鑰存儲區格式取決於與Oracle JRE捆綁在一起的可用提供程序(請參閱[本列表](http://download.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html))默認)。在[這個問題]中也有討論(http://stackoverflow.com/questions/6157550/question-on-java-keystores/6157716#6157716)。其他提供者(例如BouncyCastle)可用於其他格式。 – Bruno 2011-06-14 09:42:58

5

密鑰庫被服務器用來存儲私鑰,信任庫被第三方客戶端用來存儲由服務器提供的公鑰來訪問。我已經在我的生產應用程序中這樣做了。下面是用於生成Java證書進行SSL通信的步驟:

  1. 在Windows中使用密鑰生成命令生成證書:

密鑰工具-genkey -keystore server.keystore -alias mycert-20161109 -keyalg RSA - 密鑰大小2048 3950 -validity

  • 自我證明證書:
  • 密鑰工具-selfcert -alias我CERT-20161109 -keystore server.keystore -validity 3950

  • 導出證書到文件夾:
  • 密鑰工具-export -alias mycert-20161109 -keystore server.keystore -rfc -file mycert-20161109.cer

  • 導入證書到客戶機信任存儲:
  • 密鑰工具-importcert -alias mycert-20161109 -file C:\證書\ mycert-20161109 -keystore .t ruststore

    -1

    keystore只是存儲私鑰,wheras truststore存儲公鑰。您將需要爲SSL通信生成一個Java證書。您可以在Windows中使用keygen命令,這可能是最簡單的解決方案。

    1

    爲了共同的用例/目標或外行的方式解釋:

    信任庫:正如其名稱所示,它通常用於存儲證書的可信實體的 。一個進程可以維護其信任的所有其信任方 的證書庫。

    keystore:用於存儲服務器密鑰(公鑰和私鑰) 以及簽名證書。

    在SSL握手期間,

    1. 甲客戶端試圖訪問的https://

    2. 並且這樣,服務器通過提供SSL證書(存儲在其密鑰庫)進行響應

    3. 現在,客戶端接收到SSL證書並通過trustStore驗證它(即客戶端的trustStore已經有了它所信任的預定義證書集)。它是這樣的:我可以信任這個服務器嗎?這是我想與之交談的服務器嗎?沒有中間人攻擊?

    4. 一旦客戶端驗證它正在與其信任的服務器交談,則SSL通信可以通過共享密鑰進行。

    注意:我不是在這裏談論關於服務器端的客戶端身份驗證的任何事情。如果服務器也想執行客戶端身份驗證,那麼服務器還會維護一個trustStore來驗證客戶端。