次の手順を使用して、TLSでJava(内部)サーバーが使用する秘密/公開キーのペアを持つ新しいJavaキーストアを作成しました。証明書は自己署名されていることに注意してください。
1)AES256でキーを生成します
openssl genrsa -aes256 -out server.key 1024
2)CAの証明書要求を生成する
openssl req -x509 -sha256 -new -key server.key -out server.csr
3)自己署名された有効期限10年を生成する
openssl x509 -sha256 -days 3652 -in server.csr -signkey server.key -out selfsigned.crt
4) KeyStoreExplorer などのプログラムを使用して、新しいJKSにペア(秘密鍵と自己署名証明書)をインポートします
これは機能しますが、GUIを使用せずに最後のステップを実装したいと思います。
私は自己署名証明書のみをインポートする方法を知っています:
// create the keystore and import the public key. THIS WILL NOT IMPORT THE PRIVATE KEY SO THE KEYSTORE CAN'T BE USED ON THE SERVER TO MAKE THE TLS CONNECTION
/usr/Java/jdk1.6.0_45/bin/keytool -import -alias myservercert -file server.crt -keystore mykeystore.jks
質問は次のとおりです。GUIを使用せずにJava KeyStoreを作成し、公開鍵と秘密鍵の両方の証明書をインポートするにはどうすればよいですか?
秘密鍵と公開証明書を使用して、最初にPKCS12キーストアを作成してから、それをJKSに変換する必要があります。
# Create PKCS12 keystore from private key and public certificate.
openssl pkcs12 -export -name myservercert -in selfsigned.crt -inkey server.key -out keystore.p12
# Convert PKCS12 keystore into a JKS keystore
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias myservercert
JKSの内容を確認するには、次のコマンドを使用できます。
keytool -list -v -keystore mykeystore.jks
これが自己署名証明書ではない場合、おそらくこの手順に従って、信頼できるCA証明書に至るまでの証明書チェーンをインポートすることをお勧めします。
キーストアにはキーストアファイルが必要です。 KeyStore
クラスにはFileInputStream
が必要です。ただし、(FileInputStream
インスタンスの代わりに)nullを指定すると、 空のキーストアがロードされます 。キーストアを作成したら、keytool
を使用してその整合性を検証できます。
次のコードは、空のパスワードで空のキーストアを作成します
KeyStore ks2 = KeyStore.getInstance("jks"); ks2.load(null,"".toCharArray()); FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore"); ks2.store(out, "".toCharArray());
キーストアを取得したら、証明書のインポートは非常に簡単です。チェックアウト このリンク サンプルコード用。