286

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

keytool を使用するときにどのように/いつストアを区別するかを理解することに興味がありました。

だから、これまで私は使用してキーストアを作成しました

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

これにより、keystore.ks ファイルが作成されます。do I trust bob という質問に答えyesましたが、これがキーストア ファイルまたはトラストストア ファイルのどちらを作成したのかわかりません。ファイルをどちらかとして使用するようにアプリケーションを設定できます。

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

set を使用するとSystem.setProperty( "javax.net.debug", "ssl")、信頼できる証明書の下に証明書が表示されます (ただし、キーストア セクションの下には表示されません)。私がインポートしている特定の証明書には公開鍵しかなく、それを使用して SSL 接続を介して Bob に送信する予定です (しかし、それは別の質問に任せるのが最善でしょう!)。

ポインタや説明をいただければ幸いです。keytool の出力は、インポートしたものと同じであり、1 つがキーストアで、もう 1 つがトラスト ストアであるという規則だけですか? SSLなどを利用する場合の関係は?

4

6 に答える 6

392

用語は確かに少し紛らわしいですが、javax.net.ssl.keyStorejavax.net.ssl.trustStoreはどちらも、2 つの異なる目的で、使用するキーストアを指定するために使用されます。キーストアにはさまざまな形式があり、必ずしもファイルである必要はなく (この質問を参照)、キーストアkeytoolに対してさまざまな操作 (インポート/エクスポート/リスト/...) を実行するための単なるツールです。

javax.net.ssl.keyStoreおよびパラメータは、および を(それぞれ)javax.net.ssl.trustStore構築するために使用されるデフォルト パラメータであり、またはを介し​​て SSL/TLS 接続を確立するときに使用する SSL/TLS 設定を本質的に含むを構築するために使用されます。これらのシステム プロパティは、デフォルト値の由来であり、 によって使用され、たとえばによって使用されます。(デフォルト値とその特定の s を特定の目的で使用したくない場合は、API を介してさまざまな場所でこれらすべてをカスタマイズできます。)KeyManagerTrustManagerSSLContextSSLSocketFactorySSLEngineSSLContext.getDefault()SSLSocketFactory.getDefault()SSLContext

と の違い(したがってKeyManagerとの違い) は次のとおりです ( JSSE ref guideから引用)。TrustManagerjavax.net.ssl.keyStorejavax.net.ssl.trustStore

TrustManager: リモート認証資格情報 (および接続) を信頼する必要があるかどうかを決定します。

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

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

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

于 2011-06-14T09:26:22.277 に答える
27

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

于 2011-06-14T08:35:27.443 に答える
25

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

于 2016-12-22T10:10:01.283 に答える