キーストアは通常、秘密鍵と公開鍵を保持し、トラストストアは公開鍵のみを保持します (そして、通信する予定の信頼できるパーティのリストを表します)。まあ、それは私の最初の仮定なので、それが正しくない場合は、あまり良いスタートを切っていない可能性があります...
しかし、keytool を使用するときにストアをいつどのように区別するかを理解することに興味がありました。
これまで私はキーストアを次のように作成してきました
keytool -import -alias bob -file bob.crt -keystore keystore.ks
これにより、keystore.ks ファイルが作成されます。bobyes
を信頼するかどうかという質問に答えますが、これによってキーストア ファイルが作成されたのか、トラストストア ファイルが作成されたのかは不明です。アプリケーションを設定して、ファイルをどちらのファイルとしても使用できます。
-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")
、set を使用すると、信頼された証明書の下に証明書が表示されます (ただし、キーストア セクションの下には表示されません)。インポートする特定の証明書には公開キーのみが含まれており、これを使用して SSL 接続を介して Bob に情報を送信するつもりです (ただし、これは別の質問に残しておくのが最善かもしれません)。
何かご指摘や説明をいただければ幸いです。keytool の出力は何をインポートしても同じですか。一方がキーストアでもう一方がトラストストアであるという慣例に過ぎませんか。SSL などを使用する場合の関係はどうなりますか。
ベストアンサー1
用語は確かに少し混乱しますが、 とjavax.net.ssl.keyStore
はどちらもjavax.net.ssl.trustStore
、2つの異なる目的で使用するキーストアを指定するために使用されます。キーストアにはさまざまな形式があり、必ずしもファイルである必要はありません(この質問) であり、keytool
それらに対してさまざまな操作 (インポート/エクスポート/リスト/...) を実行するためのツールにすぎません。
およびパラメータjavax.net.ssl.keyStore
は、それぞれ およびをjavax.net.ssl.trustStore
作成するために使用されるデフォルトのパラメータであり、その後または を介して SSL/TLS 接続を行うときに使用する SSL/TLS 設定を基本的に含む を作成するために使用されます。これらのシステム プロパティは、デフォルト値の取得元であり、その後 によって使用され、それ自体は、たとえば によって使用されます。(特定の目的に対してデフォルト値や特定の を使用しない場合は、これらすべてを API を介してさまざまな場所でカスタマイズできます。)KeyManager
TrustManager
SSLContext
SSLSocketFactory
SSLEngine
SSLContext.getDefault()
SSLSocketFactory.getDefault()
SSLContext
KeyManager
とTrustManager
(そして とjavax.net.ssl.keyStore
)の違いはjavax.net.ssl.trustStore
次のとおりです(JSSE リファレンスガイド):
TrustManager: リモート認証資格情報 (および接続) を信頼するかどうかを決定します。
KeyManager: リモート ホストに送信する認証資格情報を決定します。
(他のパラメータも利用可能で、そのデフォルト値はJSSE リファレンスガイドトラストストアにはデフォルト値がありますが、キーストアにはデフォルト値がないので注意してください。
基本的に、 のキーストアにはjavax.net.ssl.keyStore
秘密鍵と証明書が格納され、 にはjavax.net.ssl.trustStore
リモート パーティが証明書を提示したときに信頼する CA 証明書が格納されます。場合によっては、これら 1 つのストアを同じにすることもできますが、通常は別々のストアを使用する方がよいでしょう (特にファイルベースの場合)。