Статус: Участник
Группы: Участники
Зарегистрирован: 31.01.2014(UTC) Сообщений: 14
|
Добрый день! Отправляем запросы к серверу. С JCP/JTLS работает такой код Код:
Security.setProperty("ssl.SocketFactory.provider","ru.CryptoPro.ssl.SSLSocketFactoryImpl");
System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
System.setProperty("javax.net.ssl.keyStoreType",ksType);
System.setProperty("javax.net.ssl.keyStorePassword", ksPassword);
System.setProperty("javax.net.ssl.trustStoreType",tsType);
System.setProperty("javax.net.ssl.trustStore",tsAlias);
System.setProperty("javax.net.ssl.trustStorePassword", tsPassword);
SSLContext sslContext = SSLContext.getInstance("GostTLS");
KeyStore keyStore = KeyStore.getInstance(ksType);
keyStore.load(null, ksPassword.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
kmf.init(keyStore, ksPassword.toCharArray());
KeyStore trustedKeyStore = KeyStore.getInstance(tsType);
trustedKeyStore.load(new FileInputStream(tsAlias), tsPassword.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
tmf.init(trustedKeyStore);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null)
HttpsURLConnection con = (HttpsURLConnection) objURL.openConnection(proxy);
con.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
Когда данный код отрабатывает первый раз, то всё хорошо. Соединение успешно, получаем ответ от сервера, все ОК. Лог такой: Код:
31.01.2014 16:06:54 ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.54 36641
31.01.2014 16:06:54 ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
setting up default SSLSocketFactory
class ru.CryptoPro.ssl.SSLSocketFactoryImpl is loaded
31.01.2014 16:06:54 ru.CryptoPro.ssl.SSLContextImpl d
...
INFO: init context...
31.01.2014 16:06:55 ru.CryptoPro.ssl.SSLContextImpl d
INFO: Context inited.
instantiated an instance of class ru.CryptoPro.ssl.SSLSocketFactoryImpl
Если же попытаться далее опять обратиться к этому же коду для отправки запроса к другому серверу, создавая новое подключение и указав новые настройки для хранилищ, то повторно SSL-контекст не инициализируется и ключи не подгружаются. В логе только вот что. Код:
31.01.2014 16:06:56 ru.CryptoPro.ssl.n a
WARNING: %% No alias is match
Подскажите, пожалуйста, в чем загвоздка и как решить данную проблему? Как корректно "перегрузить" SSLSocketFactory/SSLContext?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Добрый день. А зачем вам оба варианта: задание свойств через properties и создание контекста? Попробуйте убрать задание System.SetProperty() (keyStorePassword, trustStore и т.п., кроме первых двух). Отредактировано пользователем 31 января 2014 г. 18:51:15(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 31.01.2014(UTC) Сообщений: 14
|
Цитата:А зачем вам оба варианта: задание свойств через properties и создание контекста? Попробуйте убрать задание System.SetProperty() (keyStorePassword, trustStore и т.п., кроме первых двух). И то, и другое, чтоб уж наверняка :) Убрав properties поняла, что SSLContext был задан не верно. Теперь разобрались. Спасибо!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 30.11.2012(UTC) Сообщений: 21 Откуда: Уфа
Поблагодарили: 1 раз в 1 постах
|
Спрошу в этой теме, Код:
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
keyStore.load(null, ksPassword.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
kmf.init(keyStore, ksPassword.toCharArray());
В HDImageStore у меня 4 носителя. По установке соединения, отправляется первый в списке сертификат, который уже просрочен. Каким образом указать конкретный alias для использования в SSLContext? jtls 1.0.46Отредактировано пользователем 15 марта 2016 г. 15:23:23(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Алиас указать нельзя. Нельзя ли исключить вообще просроченный сертификат? Или сменить пароль на контейнер? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 30.11.2012(UTC) Сообщений: 21 Откуда: Уфа
Поблагодарили: 1 раз в 1 постах
|
Автор: afev Алиас указать нельзя. Нельзя ли исключить вообще просроченный сертификат? Или сменить пароль на контейнер? Решил проблему другим способом. Инициализирую KeyStore, выдергиваю нужный ПриватныйКлюч и Сертификат. Создаю новый KeyStore (JCP.MEMORY_STORE_NAME)- помещаю ключ и сертификат - туда. В итоге, в SSLContext уже передаю этот новый KeyStore (в оболочке KeyStoreManager) Код:
public static SSLSocketFactory createSSLSocketFactory(Container keyContainer, TrustContainer certContainer) throws Exception {
logger.trace("inside createSSLSocketFactory");
// инициализация временного хранилища ключей в ОЗУ
KeyStore keyStore = KeyStore.getInstance(JCP.MEMORY_STORE_NAME);
keyStore.load(null, null);
String keyAlias = UUID.randomUUID().toString();
String randomPass = UUID.randomUUID().toString();
// добавляем требуемый ключ и сертификат в хранилище
// из контейнера ключей
keyStore.setKeyEntry(
keyAlias, keyContainer.getKey(), randomPass.toCharArray(),
new Certificate[]{keyContainer.getCertificate()});
// сохраняем
keyStore.store(null, null);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
kmf.init(keyStore, randomPass.toCharArray());
// инициализация временного хранилища сертификатов в ОЗУ
KeyStore trustStore = KeyStore.getInstance(JCP.MEMORY_STORE_NAME);
trustStore.load(null, null);
// добавляем все сертификаты
for (Certificate cert : certContainer.getCertificateChain()) {
String trustAlias = UUID.randomUUID().toString();
trustStore.setCertificateEntry(trustAlias, cert);
}
// сохраняем
trustStore.store(null, null);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
tmf.init(trustStore);
SSLContext sslContext = SSLContext.getInstance("GostTLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
где Container keyContainer, TrustContainer certContainer - это просто мои контейнеры ключа с сертификатом и цепочки сертификатов - соответственно...
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close