1. 概要

このクイック記事では、JavaキーストアとJavaトラストストアの違いの概要を説明します。

2. コンセプト

ほとんどの場合、アプリケーションがSSL / TLS を介して通信する必要がある場合は、キーストアとトラストストアを使用します。

通常、これらはパスワードで保護されたファイルであり、実行中のアプリケーションと同じファイルシステム上にあります。 これらのファイルに使用されるデフォルトの形式は、Java8まではJKSです。

ただし、Java 9以降、のデフォルトのキーストア形式はPKCS12です。 JKSとPKCS12の最大の違いは、JKSはJavaに固有の形式であるのに対し、PKCS12は、暗号化された秘密鍵と証明書を格納するための標準化された言語に依存しない方法であるということです。

3. JavaKeyStore

Javaキーストアは、秘密鍵エントリ、公開鍵を含む証明書、または秘密鍵を格納します。これらは、さまざまな暗号化目的で使用できます。 ルックアップを容易にするために、それぞれをエイリアスごとに格納します。

一般的に、キーストアは、ペイロードに署名するなどして、メッセージの整合性と送信者の信頼性を証明するために使用できる、アプリケーションが所有するキーを保持します。

通常、サーバーでHTTPS を使用する場合は、キーストアを使用します。 SSLハンドシェイク中に、サーバーはキーストアから秘密鍵を検索し、対応する公開鍵と証明書をクライアントに提示します。

同様に、クライアントも自身を認証する必要がある場合(相互認証と呼ばれる状況)、クライアントにはキーストアもあり、公開鍵と証明書も提示されます。

デフォルトのキーストアはないため、暗号化されたチャネルを使用する場合は、javax.net.ssl.keyStoreおよびjavax.net.ssl.keyStorePassword。を設定する必要があります。キーストアの形式はデフォルトとは異なり、javax.net.ssl.keyStoreTypeを使用してカスタマイズできます。

もちろん、これらのキーを使用して他のニーズにも対応できます。秘密キーはデータに署名または復号化し、公開キーはデータを検証または暗号化できます。 秘密鍵はこれらの機能も実行できます。 キーストアは、これらのキーを保持できる場所です。

プログラムでキーストアと対話することもできます

4. Java TrustStore

トラストストアはその逆です。通常、キーストアは私たちを識別する証明書を保持しますが、トラストストアは他の人を識別する証明書を保持します。

Javaでは、これを使用して、通信しようとしているサードパーティを信頼します。

前の例を見てください。 クライアントがHTTPSを介してJavaベースのサーバーと通信する場合、サーバーはキーストアから関連するキーを検索し、公開キーと証明書をクライアントに提示します。

次に、クライアントである私たちは、トラストストアで関連する証明書を検索します。外部サーバーによって提示された証明書または認証局がトラストストアにない場合、SSLHandshakeExceptionが発生します。接続は正常にセットアップされません。

Javaにはcacertsというトラストストアがバンドルされており、 $ JAVA_HOME / jre / lib /securityディレクトリにあります。

これには、デフォルトの信頼できる認証局が含まれています。

$ keytool -list -keystore cacerts
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 92 entries

verisignclass2g2ca [jdk], 2018-06-13, trustedCertEntry,
Certificate fingerprint (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D

ここでは、トラストストアに92の信頼できる証明書エントリが含まれており、エントリの1つが verisignclass2gca エントリ 。 これは、JVMがによって署名された証明書を自動的に信頼することを意味します verisignclass2g2ca

ここで、javax.net.ssl.trustStoreプロパティを介してデフォルトのトラストストアの場所を上書きできます。 同様に、javax.net.ssl.trustStorePasswordおよびjavax.net.ssl.trustStoreTypeを設定して、トラストストアのパスワードとタイプを指定できます。

5. 結論

このチュートリアルでは、JavaキーストアとJavaトラストストアの主な違いとその目的について説明しました。

また、デフォルトをシステムプロパティでオーバーライドする方法も示しました。

次に、次のSSLガイドまたはJSSEリファレンスガイドを参照して、Javaでの暗号化通信の詳細を確認できます。