回答:
キーストアには、秘密鍵と、対応する公開鍵を持つ証明書が含まれています。
トラストストアには、通信を期待している他のパーティーからの証明書、または他のパーティーを識別するために信頼している認証局からの証明書が含まれています。
TrustStore
自体はありません。または、Javaドキュメントでそれを見つけることができませんでした(たとえば、java.security.TrustStore
)。認証局を信頼したい場合、それはを通じて信頼されますKeyStore
(そしてKeyStore
はに渡されますTrustManagerFactory
)。
SSLハンドシェイクでは、trustStoreの目的は資格を検証することであり、keyStoreの目的は資格を提供することです。
keyStore
JavaのkeyStoreは、公開鍵に対応する秘密鍵と証明書を格納し、SSLサーバーであるか、SSLがクライアント認証を必要とする場合に必要です。
TrustStore
TrustStoreはサードパーティからの証明書を格納します。Javaアプリケーションは通信するか、CA(Verisign、Thawte、Geotrust、GoDaddyなどの認証局)によって署名された証明書を使用してサードパーティを識別します。
TrustManager
TrustManagerは、リモート接続を信頼する必要があるかどうかを決定します。つまり、リモートパーティがそれを主張する人物であるかどうかを決定し、KeyManagerは、SSLハンドシェイク中に認証のためにリモートホストに送信する認証資格情報を決定します。
SSLサーバーの場合、鍵交換アルゴリズム中に秘密鍵を使用し、公開鍵に対応する証明書をクライアントに送信します。この証明書はkeyStoreから取得されます。SSLクライアント側では、Javaで記述されている場合、trustStoreに格納されている証明書を使用してサーバーのIDを確認します。SSL証明書は最も一般的に.cerファイルとして提供され、任意のキー管理ユーティリティ(keytoolなど)を使用してkeyStoreまたはtrustStoreに追加されます。
標準のJSSE文書の一部として、Sunからの記事に興味があるかもしれません。
http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Stores
通常、トラストストアは、X.509認証などの検証目的で、公開鍵のみを格納するために使用されます。管理性の目的で、管理者または開発者が2つを1つのストアに単純に統合することは非常に一般的です。
Javaでは、キーストアとトラストストアの違いは何ですか?
以下は、Java Secure Socket Extension(JSSE)リファレンスガイドのJavaドキュメントからの説明です。他の人が言ったことと何も違うとは思わない。しかし、それは公式のリファレンスを提供します。
キーストア/トラストストア
キーストアは、キーマテリアルのデータベースです。キーマテリアルは、認証やデータの整合性など、さまざまな目的で使用されます。PKCS12やOracleのJKSなど、さまざまなタイプのキーストアを利用できます。
一般的に、キーストア情報は、キーエントリと信頼できる証明書エントリの2つのカテゴリにグループ化できます。キーエントリは、エンティティのIDとその秘密キーで構成され、さまざまな暗号化の目的で使用できます。対照的に、信頼できる証明書エントリには、エンティティのIDに加えて公開鍵のみが含まれます。したがって、javax.net.ssl.KeyManagerなどの秘密鍵が必要な場合は、信頼できる証明書エントリを使用できません。JKSのJDK実装では、キーストアにキーエントリと信頼できる証明書エントリの両方を含めることができます。
トラストストアは、何を信頼するかを決定するときに使用されるキーストアです。すでに信頼しているエンティティからデータを受信し、そのエンティティが本物であると主張しているものであることを確認できれば、データは実際にはそのエンティティからのものであると想定できます。
エントリは、ユーザーがそのエンティティを信頼する場合にのみ、トラストストアに追加する必要があります。鍵ペアを生成するか、証明書をインポートすることにより、ユーザーはそのエントリに信頼を与えます。トラストストアのすべてのエントリーは、信頼できるエントリーと見なされます。
2つの異なるキーストアファイルがあると便利です。1つはキーエントリのみを含み、もう1つはCA証明書を含む信頼できる証明書エントリを含みます。前者には個人情報が含まれていますが、後者には含まれていません。単一のキーストアファイルの代わりに2つのファイルを使用すると、自分の証明書(および対応する秘密鍵)と他の証明書の論理的な違いをより明確に分離できます。秘密鍵の保護を強化するには、秘密鍵をアクセスが制限された鍵ストアに保管し、必要に応じて、より公的にアクセス可能な鍵ストアに信頼できる証明書を提供します。
trustStoreとkeyStoreの最初の大きな違いは、trustStoreはTrustManagerによってリモート接続を信頼するかどうかを決定するために使用されることです。keyStoreはKeyManagerから使用され、SSLハンドシェイク中に認証のためにリモートホストに送信する認証資格情報を決定します。
もう1つの違いは、SSL接続でサーバーを実行している場合、またはサーバー側でクライアント認証を有効にしている場合にのみ理論的に必要な秘密鍵がkeyStoreに含まれている一方で、trustStoreはCA(認証局)からの公開鍵または証明書を格納し、リモートパーティまたはSSL接続を信頼します。
実際、秘密鍵と公開鍵の両方を同じファイルに保存できます。これらのファイルを管理するツールは同じ(keytool)なので、1つのファイルを両方の目的に使用できますが、おそらく使用しないでください。
少なくとも私のMac OSXでは、デフォルトのkeyStoreはで${user.home}/.keystore
、デフォルトのtrustStoreは/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts
です。
それらをオーバーライドする場合は、JVMパラメータ-Djavax.net.ssl.keyStore /path/to/keyStore
またはを
追加する必要があります
-Djavax.net.ssl.trustStore /path/to/trustStore
。の場合は
java.security.UnrecoverableKeyException: Password must not be
null
、パラメータ
-Djavax.net.ssl.trustStorePassword=password
または-Djavax.net.ssl.trustStorePassword=password
主な情報源:
http://javarevisited.blogspot.co.uk/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html