トラストストアとキーストア-keytoolで作成


249

キーストアは通常、秘密鍵/公開鍵を保持し、トラストストアは公開鍵のみを保持することを理解しています(また、通信する予定の信頼できる当事者のリストを表します)。まあ、それが私の最初の仮定なので、それが正しくない場合、私はおそらくうまくスタートしていません...

しかし、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の出力は、インポートしたものと同じであり、1つはキーストアで、もう1つはトラストストアであるという規則になっていますか?SSLなどを使用する場合の関係は何ですか?


「インポートしている特定の証明書には公開鍵しかない」とはどういう意味かわかりません。それは単なる公開鍵(つまり証明書ではない)ですか、それとも非CA証明書ですか?
Bruno

うーん、わかりません。ブラウザからPEMファイルとしてエクスポートしました。それは役に立ちますか?
Toby

ブラウザからエクスポートされた場合、それはおそらく証明書です。これはサーバー証明書ですか(CNまたはsubjectAltNameがサーバーの名前と一致しています)?これはCA証明書ですか(基本制約の下を参照してください。ブラウザーを使用してこれを確認できるはずです)。
ブルーノ

2
tl; dr:トラストストアにはパブリックの信頼できるルート(CA)証明書が含まれていますが、ID /キーストアにはプライベートのID証明書が含まれています。ただし、ファイルに関しては同じです。
アンドリュー

回答:


346

用語は確かに少し混乱しますが、両方ともjavax.net.ssl.keyStorejavax.net.ssl.trustStore2つの異なる目的で使用するキーストアを指定するために使用されます。キーストアは、さまざまな形式で来ても、必ずしもファイル(参照されないこの質問に)、そしてkeytoolちょうどそれら(インポート/エクスポート/リスト/ ...)上でさまざまな操作を実行するためのツールです。

javax.net.ssl.keyStoreそしてjavax.net.ssl.trustStoreパラメータが構築するために使用されるデフォルトのパラメータであるKeyManagerSとTrustManagerその後構築するために使用されるS(それぞれ)SSLContextを介して、SSL / TLS接続を行う際に、本質的に使用SSL / TLSの設定を含むSSLSocketFactory、またはSSLEngine。これらのシステムプロパティは、デフォルト値の取得元であり、デフォルト値はによってSSLContext.getDefault()使用さSSLSocketFactory.getDefault()れます。(デフォルト値と特定SSLContextの目的のための特定のを使用したくない場合は、APIを使用していくつかの場所でカスタマイズできます。)

KeyManagerTrustManager(およびjavax.net.ssl.keyStorejavax.net.ssl.trustStore)の違いは次のとおりです(JSSE ref guideから引用)。

TrustManager:リモート認証資格情報(つまり接続)を信頼するかどうかを決定します。

KeyManager:リモートホストに送信する認証資格情報を決定します。

(他のパラメーターが使用可能であり、それらのデフォルト値はJSSE参照ガイドで説明されています。トラストストアのデフォルト値はありますが、キーストアのデフォルト値はないことに注意してください。)

基本的に、のキーストアにjavax.net.ssl.keyStoreは秘密鍵と証明書が含まれますが、にjavax.net.ssl.trustStoreは、リモートパーティが証明書を提示するときに信頼してもよいCA証明書が含まれます。場合によっては、それらを1つの同じストアにすることもできますが、個別のストアを使用することをお勧めします(特に、ファイルベースの場合)。


返事をありがとう、それは少し物事をクリアします。私はまだ混乱していますが、使用法に関しては、pk12 pri / pubキー(xxx.p12)をキーストアとして(-Dを介して)使用し、SSL接続を(信頼されて)作成できます。 D ...まあ。
Toby

57
トラストストアを指定する必要はありません。トラストストアのデフォルト値(JREにバンドルされている)があるためです$JAVA_HOME/lib/security/cacerts(通常、(2番目のJSSE参照ガイドリンクを参照してください)。ブラウザーと同様に、信頼できるCA証明書のデフォルトセットが含まれています。一般に、クライアントは常にトラストストアを使用してサーバー証明書をチェックしますが、キーストアはサーバーがクライアント証明書を要求した場合にのみ使用され、サーバーは常に独自のキー+証明書にキーストアを使用しますが、トラストストアはクライアントがクライアント証明書を送信する場合に使用されます。
Bruno

2
役立つ情報をありがとう。Weblogicには、サーバーのSSL証明書を格納する「identity-key-store」と、サーバーが信頼するSSL証明書を格納する「trust-key-store」がありますので、「identity-key-store -store」は「キーストア」にすぎず、「trust-key-store」は「トラストストア」にすぎませんか?
hagrawal 2017

@Brunoは、「jssecacerts」がある場合、「cacerts」が無視されることにも注意する必要がありますか?
kommradHomer

61

一般的なユースケース/目的または一般的な方法で説明するには:

TrustStore:名前が示すように、信頼されたエンティティの証明書を格納するために通常使用されます。プロセスは、プロセスが信頼するすべての信頼できる当事者の証明書のストアを維持できます。

keyStore:署名済み証明書とともにサーバー鍵(公開鍵と秘密鍵の両方)を格納するために使用されます。

SSLハンドシェイク中に、

  1. クライアントがhttps://にアクセスしようとしています

  2. したがって、サーバーはSSL証明書(keyStoreに格納されている)を提供して応答します。

  3. これで、クライアントはSSL証明書を受信し、trustStoreを介してそれを検証します(つまり、クライアントのtrustStoreには、事前に定義された一連の証明書が信頼されています)。そのようなもの:このサーバーを信頼できますか?これは私が話そうとしているのと同じサーバーですか?中間者攻撃はありませんか?

  4. クライアントは、信頼しているサーバーと通信していることを確認すると、共有秘密鍵を介してSSL通信を行うことができます。

注:ここでは、サーバー側のクライアント認証については何も話していません。サーバーもクライアント認証を実行したい場合、サーバーはクライアントを検証するためのtrustStoreも維持します。


25

キーストアファイルとトラストストアファイルに違いはありません。どちらも独自のJKSファイル形式のファイルです。区別は使用中です。私の知る限りでは、Javaは-Djavax.net.ssl.trustStoreシステムプロパティによって参照されるストアのみを使用して、SSL接続を作成するときに信頼する証明書を探します。キーとについても同じです-Djavax.net.ssl.keyStore。ただし、理論的には、信頼ストアとキーストアに同じファイルを使用しても問題ありません。


4
設定することで、さまざまなタイプのキーストア(PKCS12など)を使用できます。 javax.net.ssl.keyStoreTypeおよびjavax.net.ssl.trustStoreTypeシステムプロパティをます。
ドナルフェロー

1
@ドナル:良い追加。サポートされているすべてのコンテナのリストがあるかどうかを知っていますか?私はPKCS12とJKSのみを知っています(前者は試行錯誤の結果です...)。
musiKk

2
キーストアの形式は、使用可能なプロバイダーによって異なります(デフォルトでOracle JREにバンドルされているプロバイダーについては、このリストを参照してください)。この質問でも議論がありました。他のプロバイダー(BouncyCastleなど)を他のフォーマットに使用できます。
Bruno

21

鍵ストアはサーバーが秘密鍵を保管するために使用され、トラストストアはサーバーがアクセスするために提供する公開鍵を保管するためにサードパーティのクライアントが使用します。私は本番アプリケーションでそれを行いました。以下は、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


こんにちは、同じコンテナ(tomcat)内に2つの異なるアプリケーションがある1つのシナリオがあります。両方のアプリケーションから、残りのエンドポイントを両側から各アプリケーションに呼び出す必要があります。同様に、AからBおよびBからAへ(AとBは2つのアプリケーションです)。このシナリオではトラストストアを使用する必要がありますか?キーストアを使用しているカスタムRESTクライアントを使用しているため。提案してください。
ディーパック

0

以下は、Keytoolを使用してローカルマシンにトラストストアを作成する手順です。ローカルマシンでURLのトラストストアを作成する手順。

1)Chromeを使用してブラウザのURLにアクセスします

2)「i」を確認しますクロムのURLの左側にアイコンをクリックします

3)証明書オプションを確認するをクリックすると、ダイアログボックスが開きます

4)「証明書パス」タブで、トラストストアの作成に使用できる証明書の数を確認します

5)"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

-1

keystoreは秘密鍵を格納するだけで、トラストストアは公開鍵を格納します。SSL通信用のJava証明書を生成する必要があります。あなたはwindowsでkeygenコマンドを使うことができます、これはおそらく最も簡単な解決策でしょう。


トラストストアは、信頼できる証明書を保管します。
ローン侯爵

-1

最も簡単な言葉で:

キーストアは、トラストストア中に資格情報(サーバーまたはクライアント)を格納するために使用されますを格納するために使用されは他の資格情報(CAからの証明書)を格納するために使用されます。

SSLでサーバー側を設定する場合、キーストアが必要です。これは、サーバーのID証明書を格納するために使用されます。このサーバーは、接続でクライアントに提示し、クライアント側のトラストストアの設定には、接続を機能させるために含める必要があります。ブラウザを使用してSSL経由でWebサイトに接続すると、トラストストアに対してサーバーから提示された証明書が検証されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.