Импорт пары 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());
Как только у вас есть хранилище ключей, импорт сертификата очень прост. Оформить заказ эту ссылку для примера кода.