Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline WinterAnna  
#1 Оставлено : 31 января 2014 г. 17:56:02(UTC)
WinterAnna

Статус: Участник

Группы: Участники
Зарегистрирован: 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?
Offline Евгений Афанасьев  
#2 Оставлено : 31 января 2014 г. 18:50:30(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,927
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Добрый день.
А зачем вам оба варианта: задание свойств через properties и создание контекста? Попробуйте убрать задание System.SetProperty() (keyStorePassword, trustStore и т.п., кроме первых двух).

Отредактировано пользователем 31 января 2014 г. 18:51:15(UTC)  | Причина: Не указана

Offline WinterAnna  
#3 Оставлено : 4 февраля 2014 г. 18:31:25(UTC)
WinterAnna

Статус: Участник

Группы: Участники
Зарегистрирован: 31.01.2014(UTC)
Сообщений: 14
Женщина
Российская Федерация

Цитата:
А зачем вам оба варианта: задание свойств через properties и создание контекста? Попробуйте убрать задание System.SetProperty() (keyStorePassword, trustStore и т.п., кроме первых двух).


И то, и другое, чтоб уж наверняка :)
Убрав properties поняла, что SSLContext был задан не верно.

Теперь разобрались. Спасибо!
Offline eagames-ru  
#4 Оставлено : 15 марта 2016 г. 15:18:25(UTC)
eagames-ru

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Евгений Афанасьев  
#5 Оставлено : 15 марта 2016 г. 16:23:39(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,927
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Алиас указать нельзя. Нельзя ли исключить вообще просроченный сертификат? Или сменить пароль на контейнер?
Offline eagames-ru  
#6 Оставлено : 23 марта 2016 г. 8:27:07(UTC)
eagames-ru

Статус: Участник

Группы: Участники
Зарегистрирован: 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 - это просто мои контейнеры ключа с сертификатом и цепочки сертификатов - соответственно...
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.