Импорт пары private-key/public-certificate в Java KeyStore

Я использовал следующие шаги для создания нового хранилища ключей Java с парой частного/открытого ключа, который будет использоваться сервером Java (внутренний) с TLS. Обратите внимание, что сертификат самоподписан:

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

Это работает, но я бы хотел реализовать последний шаг без использования графического интерфейса.

Я знаю, как импортировать только подписанный сертификат:

// 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

Итак, возникает вопрос: как я могу создать Java KeyStore и импортировать как сертификат с открытым ключом, так и закрытый ключ без использования графического интерфейса?

Ответ 1

С вашим личным ключом и общедоступным сертификатом сначала необходимо создать хранилище ключей 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.

Ответ 2

Для хранилища ключей требуется файл хранилища ключей. Для класса KeyStore требуется FileInputStream. Но если вы укажете нуль (вместо экземпляра FileInputStream), будет загружено пустое хранилище ключей. После создания хранилища ключей вы можете проверить его целостность с помощью keytool.

Следующий код создает пустое хранилище ключей с пустым паролем

  KeyStore ks2 = KeyStore.getInstance("jks");
  ks2.load(null,"".toCharArray());
  FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore");
  ks2.store(out, "".toCharArray());

Как только у вас есть хранилище ключей, импорт сертификата очень прост. Оформить заказ эту ссылку для примера кода.