キーストアとトラストストアの違いは何ですか?
キーストアには、秘密鍵と、対応する公開鍵を持つ証明書が含まれます。
トラストストアには、通信する予定の他の当事者からの証明書、または他の当事者を識別するために信頼する認証局からの証明書が含まれます。
キーストアには秘密鍵が含まれています。これは、サーバーである場合、またはサーバーでクライアント認証が必要な場合にのみ必要です。
トラストストアには、信頼するCA証明書が含まれています。サーバーの証明書が認識されたCAによって署名されている場合、JREに同梱されているデフォルトのトラストストアはすでに信頼しているため(すでに信頼できるCAを信頼しているため)、独自のCAを作成したり、何かを追加したりする必要はありませんJREから。
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に保存されている証明書を使用してサーバーの身元を確認します。 SSL証明書は、一般的に。cerファイルとして提供されます。これは、キー管理ユーティリティを使用してkeyStoreまたはtrustStoreに追加されます。 keytool。
また、標準のJSSEドキュメントの一部として、Sunからの記事にも興味があるかもしれません。
http://docs.Oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Stores
通常、トラストストアは、X.509認証などの検証目的で、公開キーのみを格納するために使用されます。管理の容易性のために、管理者または開発者が単純に2つを単一のストアに統合することは非常に一般的です。
Javaでは、キーストアとトラストストアの違いは何ですか?
Java Secure Socket Extension(JSSE)リファレンスガイド のJavaドキュメントの説明を次に示します。他の人が言ったことと違うことを言っているとは思わない。ただし、公式のリファレンスは提供します。
keystore/truststore
キーストアは、キーマテリアルのデータベースです。キーマテリアルは、認証やデータの整合性など、さまざまな目的に使用されます。 PKCS12やOracleのJKSなど、さまざまなタイプのキーストアが利用可能です。
一般的に、キーストア情報は、キーエントリと信頼できる証明書エントリの2つのカテゴリにグループ化できます。キーエントリは、エンティティのIDとその秘密キーで構成され、さまざまな暗号化目的に使用できます。対照的に、信頼できる証明書エントリには、エンティティのIDに加えて公開キーのみが含まれます。したがって、信頼できる証明書エントリは、javax.net.ssl.KeyManagerなどの秘密鍵が必要な場所では使用できません。 JKSのJDK実装では、キーストアにキーエントリと信頼できる証明書エントリの両方が含まれる場合があります。
トラストストアは、何を信頼するかを決定するときに使用されるキーストアです。既に信頼しているエンティティからデータを受信し、そのエンティティが主張するエンティティであることを確認できる場合、データは実際にそのエンティティからのものであると想定できます。
ユーザーがそのエンティティを信頼する場合のみ、エントリをトラストストアに追加する必要があります。キーペアを生成するか、証明書をインポートすることにより、ユーザーはそのエントリに信頼を与えます。トラストストアのエントリは、信頼できるエントリと見なされます。
2つの異なるキーストアファイルがあると便利です。1つはキーエントリのみを含み、もう1つはCA証明書を含む信頼できる証明書エントリを含みます。前者には個人情報が含まれていますが、後者には含まれていません。単一のキーストアファイルの代わりに2つのファイルを使用すると、独自の証明書(および対応する秘密キー)と他の証明書の論理的な区別をより明確に分離できます。秘密鍵の保護を強化するには、アクセスを制限したキーストアに保存し、必要に応じて、より公開されたアクセス可能なキーストアに信頼できる証明書を提供します。
TrustStoreとkeyStoreの最初の大きな違いは、trustStoreがTrustManagerによって使用され、リモート接続を信頼する必要があるかどうかを判断することです。
もう1つの違いは、keyStoreには理論的には、SSL接続でサーバーを実行している場合、またはサーバー側でクライアント認証を有効にしている場合にのみ必要な秘密鍵が含まれていることです。リモートパーティまたはSSL接続を信頼します。
実際、秘密鍵と公開鍵の両方を同じファイルに保存できます。これらのファイルを管理するツールが同じ(keytool)であれば、you両方の目的で単一のファイルを使用しますが、おそらくは使用しないでください。
少なくとも私のMac OSXでは、デフォルトのキーストアは${user.home}/.keystore
であり、デフォルトのトラストストアは/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
の場合にkeyStoreパスワードを設定する必要がある場合もあります
メインソース:
http://javarevisited.blogspot.co.uk/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html