web-dev-qa-db-ja.com

キーストアとは何ですか?

私は取得しています:

Sun.security.validator.ValidatorException: PKIX path building failed: 
Sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
.
.
Caused by: javax.net.ssl.SSLHandshakeException: Sun.security.validator.
ValidatorException: PKIX path building failed: Sun.security.provider.
certpath.SunCertPathBuilderException: unable to find valid certification 
path to requested target

この例外を解決する方法を検索して、理解できないKeystoreという用語に出会いました。簡単に言えば、キーストアとは何ですか? SSLとどのように関連していますか?

53
saplingPro

Keystorein Javaは、コンテキストに応じて3つのことを参照できます。これらはすべて密接に関連していますが、微妙に関連しています。違う。)

  • キーストアは、秘密鍵、証明書、対称鍵を保存できるリポジトリにすることができます。これは通常ファイルですが、ストレージはさまざまな方法で処理することもできます(たとえば、暗号化トークンまたはOS独自のメカニズムを使用します)。

  • KeyStore も標準APIの一部であるクラスです。これは、本質的に、上記の「物理」キーストアの1つをロード、保存、および一般的に対話する方法です。アプリケーションのAPI抽象化だけが必要な場合は、KeyStoreを純粋にメモリに置くこともできます。

    このようなKeyStoreインスタンスをロードして処理する方法は、それをサポートするキーストアファイル(または他のストレージシステム)の形式によって異なります。 複数のフォーマット が利用可能です。最も一般的なもののいくつかは、JKSおよびPKCS#12(.p12)です。

  • 「キーストア」は、「トラストストア」の対応物としても使用できます。 「キーストア」と「トラストストア」はどちらもキーストアであるため、混乱を招く可能性があります。これらは異なる目的に使用されるだけです。詳細は this answer で確認できます。鍵ストアは鍵マネージャーの初期化に使用され、トラストストアは信頼マネージャーの初期化に使用されます。 JSSEリファレンスガイド から:

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

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

    基本的に、トラストストアとして使用されるキーストアには、信頼できる多数の(CA)証明書が含まれます。これらは、まだ知らない信頼できないリモート証明書を検証するために使用するトラストアンカーです。対照的に、キーストアとして使用されるキーストアには、独自の証明書とその秘密キーが含まれます。これは、リモートパーティに対して自分自身を認証するために使用するものです(必要な場合)。

    JREにバンドルされたデフォルトのトラストストアがあります(/lib/security/cacerts)。通常、ユーザーにとってより明示的なステップであるため、デフォルトのキーストアはありません。

SSL/TLSのコンテキストでは、キーストア(キーストアとして使用されるキーストア)は、サーバーが証明書と秘密キーを保存する場所です(または、クライアント証明書認証が使用される場合、クライアントが証明書と秘密キーを保存する場所)。トラストストア(トラストストアとして使用されるキーストア)は、SSL/TLSサーバーに接続するときにサーバー証明書を検証できるように、クライアントが信頼するCAのCA証明書を保管する場所です(同様に、サーバー側では、クライアント証明書の検証に使用されるCA証明書が保存される場所でもあります)。

通常、取得しているエラー( "ValidatorException: PKIX path building failed ")は、接続しているサーバーの証明書が、使用しているトラストストア内の証明書を使用して検証できない場合に発生します。通常、トラストストア内のサーバー証明書( (小規模でのみ管理可能)またはそのサーバー証明書の発行に使用されたCAのCA証明書(またはチェーンが存在する場合、提示するチェーン内の証明書の1つ)。

124
Bruno

簡単に言えば、SSLエンドポイントへの接続を確立するには、その公開証明書を信頼する必要があります。証明書を信頼するには、それ自体またはその発行者の証明書がキ​​ーストアに存在する必要があります。

キーストアは、証明書を含むフォルダーのセットまたはデータベース/リポジトリーと考えてください。物理的には、JRE内のファイル(/lib/security/cacerts)。

このリポジトリは、JREに付属のkeytoolコマンドを使用して変更できます。一般的なコマンドについては this link をご覧ください。別の方法は、Javaコントロールパネルの証明書ダイアログを使用することです(これもJREと共にインストールされます):

Certificate Dialog

10
Zeemee