JavaでKeyPairGeneratorクラスを使用して公開秘密鍵ペアを作成しました。この鍵ペアから、検証のためにCAに送信されたPKCS10クラスを使用してCSR要求を生成しました。問題は、この公開秘密鍵ペアをキーストアにどのようにロードするかです。 KeyStore.SetKeyEntryを使用することはできません。秘密鍵とともに証明書パラメーターが必要なためです。
キーペアの読み込みに使用する証明書がCAから返されるまで待つ必要があると思いました。しかし、keytoolコマンドを使用してキーストアを作成すると、
keytool -genkey -keyalg RSA -keysize 2048 -sigalg sha1withRSA -alias aliasname -validity 365 -keystore keystorename
次に、このキーストアをJavaキーストアクラスにロードします。キーストアオブジェクトには、privatekeyentryとCertificateEntryが含まれています。これは、CAから証明書を取得しなくても可能です。
Java code( KeyPairGenerator
)を使用して公開鍵/秘密鍵のペアを作成すると、鍵のペアは通常RAMのみ。全体Java暗号化アーキテクチャは拡張可能であり、「どこかに」秘密鍵を保存する特定のKeyPairGenerator
インスタンスを使用することが可能ですが、一般的に、たとえば KeyStore
クラスを使用するか、明示的なファイルを使用して手動で保存するように手配する必要があります(たとえば この回答 を参照)。
いずれの場合も、CAに送信されるPKCS#10要求には公開鍵のみが含まれます。 CAは秘密鍵を決して学習しないため、秘密鍵をユーザーに送信することはできません。
keytool
コマンドラインユーティリティは、ストレージ部分自体を実行できます。 「キーストア」形式では、秘密鍵は単独では存在せず、証明書にのみリンクされるため、keytool
ユーティリティは、秘密鍵に付随する自己署名証明書を生成します。これがこのコマンドの理由です。
keytool -genkeypair -keyalg RSA -keysize 2048
パスワード(秘密鍵自体を暗号化するため)や、名前や国などの個人情報を含むいくつかの質問が表示されます。これらの質問は、自己署名証明書フィールドに入力するためのものです。
CAから証明書を取得したら、それをキーストアにインポートして、自己署名証明書を置換できます。 「キーエイリアス」は、使用する特定の秘密キーを指定するために使用されます。関連するコマンドの詳細については このブログ投稿 を参照してください。
Java keytoolを使用してキーストアを作成すると、キーペアが生成され、証明書は秘密鍵自体で署名されます。したがって、この場合は自己署名証明書があります。
これは次のコマンドで確認できます
keytool -list -v -keystore <keystore>
表示される最初の証明書は、所有者と発行者が同じである必要があります。