Java keytool(CA証明書を持たないサーバーのサーバー認証用)を使用してトラストストアを作成しました。しかし、何か奇妙なことに気づきました。クライアントを次のように起動しています:
Java -Djavax.net.ssl.trustStore=<PATHSTUFF>/client.keystore -classpath <STUFF> Client
(注:パスワードは指定されていません)
上記の呼び出しは機能します。
しかし、これを試してみると:
Java -classpath <STUFF> Client
それは動作しません。 (明らかに動作しません。トラストストアが必要です)。
私はこのオプションを渡す必要があると期待していました(しかし私はしませんでした):
-Djavax.net.ssl.trustStorePassword=mypass
質問:トラストストアにアクセスするのにパスワードは必要ありませんか?パスワードは変更専用ですか?キーストアはどうですか?
パスワードは、キーストアの整合性を保護するために使用されます。ストアパスワードを指定しなくても、キーストアの内容を読み取ることができます。コマンド keytool -list
はこの動作を示しています(空のパスワードで使用します)。
@ Pascal-thiventの優れた答えに加えて:
キーストアのパスワードには2つの目的があります。指定しない場合、keytool
はストアのコンテンツを新しいコンテンツに置き換えることを拒否します。既存の証明書エントリを削除するか、新しい証明書エントリを追加します。
もちろん、keytool
を使用してキーストアファイルを更新する書き込みアクセス権がある場合(setuidではありません)、パスワードをチェックしない別のツールを使用して内容を置き換えることができます。また、ストアとそのフォーマットはパスワードなしで読み取ることができるので、必要なものを書き込むことができます。
ここで確認パスワードが入力されます。ストアエントリが書き出されると、提供されたストアパスワードを使用して、パスワードでソルトされたストアコンテンツのダイジェストが計算されます。これは一方向のハッシュ/ダイジェストであるため、パスワードがないと、ストアのコンテンツが改ざんされているかどうかを確認できません。同様に、パスワードを知らない悪意のある人物も、ストアのコンテンツを変更して、そのパスワードによって生成されるダイジェストハッシュを生成することはできません。
そのため、パスワードを指定しない場合、keytool
は、ストアが改ざんされていないことを確認できないことを警告するだけです。 invalidパスワードを入力した場合、またはストアhasが改ざんされている場合は、別のメッセージが表示されます。
Enter keystore password: keytool error: Java.io.IOException: Keystore was tampered with, or password was incorrect
keytool
は、現在のストアの内容と指定されたパスワードに基づいて既存のハッシュダイジェストを再作成できなかったため、パスワードが間違っているか、キーストアが危険にさらされています-keytool
にはわかりません、しかし、それはあなたやストアを読んでいるソフトウェアが知っていることを前提としています。
keystoreという用語が一般的に使用されていますが、これはkeystoresおよびtruststoresを同等に指すことに注意してください。あまり一般的ではありませんが、keystoreはidentity storeであることが多く、IDとその秘密の秘密鍵が含まれています。 HTTPSを実行しているサーバーによって。 truststoreには、公開鍵のみが含まれ、秘密鍵は含まれないことが多いため、シークレットは含まれませんが、clientがどのIDを信頼するかを決定することが重要です。