настройка SSLContext с использованием существующей пары SSL-ключ/сертификат в java (JSSE API)

Я работаю над проектом Java, где я должен реализовать SSL-протокол на стороне сервера. Это первый раз, когда я буду использовать SSL в своем приложении, поэтому я много читал о SSL/TLS, и теперь я хочу реализовать что-то на Java. Я реализую этот процесс с помощью JSSE API:

  1. Клиент соединится со мной

  2. Я буду аутентифицироваться с помощью сертификата открытого ключа. Я имею в виду, что я отправлю клиенту открытый ключ и соответствующий сертификат

  3. Клиент шифрует секретный ключ, используя мой открытый ключ и алгоритм RSA, и отправляет его мне.

У меня уже есть закрытый ключ и сертификат, сохраненные в хранилище ключей на моем компьютере. Поэтому я сомневаюсь, как получить к ним доступ из моего Java-приложения. Я не знаю, какие шаги нужно сделать, чтобы получить к ним доступ, так как я впервые имею дело с такими вещами.

Я буду использовать SSLEngine. Поэтому я должен сначала инициализировать SSLContext, используя этот код:

// First initialize the key and trust material.
KeyStore ksKeys = KeyStore.getInstance("JKS");
ksKeys.load(new FileInputStream("/.../myKey"), passphrase);
KeyStore ksTrust = KeyStore.getInstance("JKS");
ksTrust.load(new FileInputStream("/../myCertificate"), passphrase);

sslContext = SSLContext.getInstance("TLS");
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// We're ready for the engine.
SSLEngine engine = sslContext.createSSLengine(hostname, port);

// Use as client
engine.setUseClientMode(true);

Я действительно новичок в криптографии, и я впервые программирую этот материал. Есть идеи?


person amitakCs    schedule 07.09.2015    source источник
comment
У вас также есть закрытый ключ, где? Почему всего этого еще нет в хранилище ключей?   -  person user207421    schedule 07.09.2015
comment
Я знаю. Я действительно новичок в этой области. Я знаю по крайней мере путь к ним. Должен ли я использовать InputStream для их чтения, а затем загружать их в мое хранилище ключей?   -  person amitakCs    schedule 07.09.2015
comment
это правильный путь?   -  person amitakCs    schedule 07.09.2015
comment
Мне действительно жаль. Я сказал, что я не знаю, почему?. У меня они есть на компе (по крайней мере я знаю путь к ним)   -  person amitakCs    schedule 07.09.2015
comment
И как они туда попали? Магия? Кто сгенерировал закрытый ключ? В каком формате? Кто сгенерировал CSR? Кто его подписал? Как был предоставлен подписанный сертификат и его цепочка подписантов?   -  person user207421    schedule 07.09.2015
comment
простите. Я думаю, он уже находится в хранилище ключей, как вы сказали в своем первом комментарии. Он уже был сгенерирован и уже находится на моем компьютере. Я должен получить доступ к этому хранилищу ключей с помощью своего java-приложения.   -  person amitakCs    schedule 07.09.2015
comment
Когда у меня уже есть хранилище ключей на моем компьютере, как я могу получить к ним доступ из своего java-приложения, чтобы иметь возможность отправить свой открытый ключ и сертификат клиенту?   -  person amitakCs    schedule 07.09.2015


Ответы (2)


На сервере и открытый ключ, и его сертификат попадают в хранилище ключей вместе с исходным закрытым ключом под одним и тем же псевдонимом.

Если сертификат является самоподписанным, вам необходимо экспортировать его оттуда в хранилище доверенных сертификатов клиента.

Для этого не нужно писать код. Просто установите свойства системы:

javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword
javax.net.ssl.trustStore

по мере необходимости.

person user207421    schedule 07.09.2015
comment
сертификат не является самоподписанным. Так должен ли я отправить открытый ключ и сертификат клиенту, чтобы он мог идентифицировать меня? - person amitakCs; 07.09.2015
comment
Если вы внимательно прочитаете мой ответ еще раз, вы увидите, что я не указал никаких необходимых действий, если ваш сертификат не является самоподписанным, - person user207421; 07.09.2015

После того, как я был сбит с толку, я провел много исследований и смог найти решение. Сначала опишу ситуацию, потом дам шаги решения проблемы. Как я сказал в своем посте, у меня был закрытый ключ (файл .key) и сертификат (файл .cer), и мне нужно использовать их в моем java-приложении (сервер, использующий ssl-протокол). Поэтому первым шагом является создание файла хранилища ключей с именем.jks, содержащего сертификат/ключ, чтобы я мог использовать их для вашего сервера на основе Java. Для этого шага я использовал шаги, описанные в этой ссылке http://blog.jgc.org/2011/06/importing-existing-ssl-keycertificate.html

Теперь, как я могу использовать файл my.jks в приведенном выше коде?

Ну, это кусок кода, как инициализировать ваш SSLEngine:

char [] keyphrase="xxx".toCharArray();
char [] passphrase= "yyy".toCharArray();

// First initialize the key and trust material.
KeyStore ksKeys = KeyStore.getInstance("JKS");
InputStream readStream = new FileInputStream(new File("/.../file.jks"));
ks.load(readStream, passphrase );
// create an factory for key-managers
KeyManagerFactory   =KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, keyphrase);
SSLContext sslContext = SSLContext.getInstance("TLS");
//initialize the ssl-context
sslContext.init(kmf.getKeyManagers(),null,null);
// We're ready for the engine.
SSLEngine engine = sslContext.createSSLEngine(host, port);
// Use as client
engine.setUseClientMode(true);
person amitakCs    schedule 08.09.2015
comment
Как я уже сказал в своем ответе, для этого не нужно писать код. Все это можно сделать с помощью системных свойств. - person user207421; 08.09.2015
comment
В порядке. Да, я знаю. Это было ново для меня. Я использовал эту ссылку stackoverflow.com/questions/5871279/ java-ssl-and-cert-keystore, чтобы получить представление об этом. Первая проблема, которая возникла у меня (в моем посте), это как получить .jks-файл, так как я не могу использовать материалы, не имея .jks-формата. Спасибо за совет - person amitakCs; 08.09.2015