2013-07-17 13 views
67

Я использовал следующие шаги для создания нового хранилища ключей Java с парой частного/открытого ключа, который будет использоваться сервером Java (внутренний) с TLS. Пожалуйста, обратите внимание, что сертификат selfsigned:Импорт пары private-key/public-сертификата в Java KeyStore

1) ключ Сформировать с AES256

openssl genrsa -aes256 -out server.key 1024 

2) Сформировать CERT запрос 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, чтобы импортировать пару (priva те ключ и самоподписанный сертификат) в новом 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 и импорт и сертификат с открытым ключом и закрытый ключ без использования GUI?

+1

Возможно, эта программа Java «ImportKey» выполнит эту работу без использования графического интерфейса: http://www.agentbob.info/agentbob/79-AB.html – sk2212

+0

Если целевой системой является Java, нет необходимости использовать OpenSSL вообще, просто keytool. См., Например, Справочное руководство JSSE или документацию инструмента для ключевого инструмента. – EJP

ответ

162

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

+10

http://stackoverflow.com/a/8224863/183622 показывает более подробный пример, включая сертификаты CA и сохранение цепочки, если это необходимо –

0

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

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

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

После того, как у вас есть хранилище ключей, импорт сертификата очень легко. Оформить заказ this link для образца кода.

+0

Нет необходимости писать какой-либо код для этого. Ссылка, которую вы указали, содержит значительные ошибки. – EJP

+0

@ EJB, я видел ваш комментарий к блогу. Я согласен с тем, что нет необходимости писать какой-либо код для этого. Но, если это нужно сделать программным путем? – Santosh

+1

Кроме того, ваше наблюдение за 'InpputStream.available()' является правильным, но я вижу, что документация 'FilterInputStream.available() 'говорит _Отбрасывает оценку количества байтов, которые могут быть прочитаны (или пропущены) из этого входного потока_, и нет предупреждения! В примере (в блоге) 'DataInputStream.available()' используется везде, а 'FilterInputStream' расшифровывается' DataInputStream'. Нельзя ли использовать 'available()' в этом конкретном случае безопасно? – Santosh

Смежные вопросы