簡體   English   中英

Trust Store 與 Key Store - 使用 keytool 創建

[英]Trust Store vs Key Store - creating with 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 的 output 是否都相同,它的約定是一個是密鑰庫,另一個是信任庫? 使用SSL等有什么關系?

術語確實有點混亂,但是javax.net.ssl.keyStorejavax.net.ssl.trustStore都用於指定要使用的密鑰庫,用於兩個不同的目的。 密鑰庫有多種格式,甚至不一定是文件(參見這個問題),而keytool只是一種對它們執行各種操作(導入/導出/列表/...)的工具。

javax.net.ssl.keyStorejavax.net.ssl.trustStore參數是用於構建KeyManager s 和TrustManager s(分別)的默認參數,然后用於構建一個SSLContext ,它基本上包含要在以下情況下使用的 SSL/TLS 設置通過SSLSocketFactorySSLEngine建立 SSL/TLS 連接。 這些系統屬性正是默認值的來源,然后由SSLContext.getDefault()使用,例如,本身由SSLSocketFactory.getDefault()使用。 (所有這些都可以通過 API 在許多地方進行自定義,如果您不想使用默認值和特定的SSLContext用於給定目的。)

KeyManagerTrustManager之間的區別(以及javax.net.ssl.keyStorejavax.net.ssl.trustStore之間的區別)如下(引自JSSE 參考指南):

TrustManager:確定是否應信任遠程身份驗證憑據(以及連接)。

KeyManager:確定將哪些身份驗證憑據發送到遠程主機。

(其他參數可用,它們的默認值在JSSE 參考指南中進行了描述。請注意,雖然信任存儲有默認值,但密鑰存儲沒有默認值。)

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

以常見的用例/目的或外行方式解釋:

TrustStore :用於存儲可信實體的證書 進程可以維護它信任的所有受信方的證書存儲。

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

在 SSL 次握手過程中,

  1. 客戶端嘗試訪問 https://

  2. 因此,服務器通過提供 SSL 證書(存儲在其密鑰庫中)進行響應

  3. 現在,客戶端收到 SSL 證書並通過 trustStore 對其進行驗證(即客戶端的 trustStore 已經具有它信任的預定義證書集。)。 就像:我可以信任這個服務器嗎? 這是我要與之交談的同一台服務器嗎? 沒有中間人攻擊?

  4. 一次,客戶端驗證它正在與它信任的服務器對話,然后 SSL 通信可以通過共享密鑰進行。

注意:我在這里不是在談論服務器端的客戶端身份驗證。 如果服務器也想進行客戶端身份驗證,那么服務器也會維護一個 trustStore 來驗證客戶端。 然后它變成了雙向 TLS。

Keystore 是服務器用來存儲私鑰的,Truststore 是第三方客戶端用來存儲服務器提供的公鑰以供訪問的。 我已經在我的生產應用程序中做到了。 以下是為 SSL 通信生成 java 證書的步驟:

  1. 在 windows 中使用 keygen 命令生成證書:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. 自我證明證書:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. 將證書導出到文件夾:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. 將證書導入客戶端信任庫:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore

密鑰庫和信任庫文件之間沒有區別。 兩者都是專有 JKS 文件格式的文件。 區別在於使用:據我所知,在創建 SSL 連接時,Java 將僅使用-Djavax.net.ssl.trustStore系統屬性引用的存儲來查找要信任的證書。 密鑰和-Djavax.net.ssl.keyStore相同。 但從理論上講,將同一個文件用於信任庫和密鑰庫是可以的。

這些是使用 Keytool 在本地機器上創建信任庫的步驟。 在本地計算機中為 URL 創建信任庫的步驟。

1)使用chrome在瀏覽器中點擊url

2)在chrome中查看url左側的“i”圖標並點擊

3) 檢查證書選項並單擊它,將打開一個對話框

4) 檢查“證書路徑”選項卡中可用於創建信任庫的證書數量

5) Go "details" tab -> click"Copy to File" -> Give the path and the name for the certificate

6)檢查它是否有父證書並按照“5”點進行操作。

7) 創建所有證書后,打開命令提示符並導航到您創建證書的路徑。

8) 提供以下 Keytool 命令來添加證書並創建信任庫。

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) 為所有證書提供keytool 命令並將它們添加到信任庫中。

    keytool -list -v -keystore cacerts

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

我知道密鑰庫通常會保存私鑰/公鑰,而信任存儲僅公鑰(並代表您打算與之通信的受信任方的列表)。 好吧,這是我的第一個假設,所以如果這不正確,我可能還沒有很好地開始......

不過,我有興趣了解使用 keytool 時如何/何時區分商店。

所以,到目前為止,我已經使用

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

它創建了我的 keystore.ks 文件。 我對我是否信任 bob 的問題回答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 的 output 是否相同,並且它只是約定一個是密鑰庫,另一個是信任庫? 使用SSL等有什么關系?

暫無
暫無

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

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