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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline ==fff==  
#1 Оставлено : 24 октября 2022 г. 13:16:25(UTC)
==fff==

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.09.2022(UTC)
Сообщений: 35
Туркменистан

Сказал(а) «Спасибо»: 2 раз
Добрый день. Поступила задача, предполагающая подключение к Приемному комплексу ЭСФ от ФНС.

Связь с ПК ЭСФ осуществляется по протоколу HTTP, работающему поверх протокола TLS. Для успешного соединения с ПК ЭСФ должна выполняться процедура рукопожатия (tls handshake) со следующими параметрами:
  • в сообщении Client Hello должна быть уканана поддержка cipher suite с кодами TLS_GOSTR341001_WITH_28147_CNT_IMIT (0x0081) или TLS_GOSTR341112_256_WITH_28147_CNT_IMIT (0xFF85), а также расширение server_name.
  • в сообщении Certificate должен отправляться сертификат обезличенной электронной подписи, заранее зарегистрированный в ФНС.


Ранее подобных задач не делал. Набросал код на java для проверки подключения и словил ошибку Unsupported CipherSuite. После погуглил по указанным шифросьютам и пришел на форум КриптоПро.

Подскажите пожалуйста, правильно понимаю, что подключение с данными шифросьютами возможны реализовать только с либами КриптоПро?
Offline Масаня  
#2 Оставлено : 27 октября 2022 г. 19:45:10(UTC)
Масаня

Статус: Новичок

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

У нас точно такая же задача,
Я использовал Крипто Про java-csp-5.0.42119-A,
код для cipher suite подходит вроде "кузнечик" - TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC

Offline ==fff==  
#3 Оставлено : 28 октября 2022 г. 12:43:44(UTC)
==fff==

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.09.2022(UTC)
Сообщений: 35
Туркменистан

Сказал(а) «Спасибо»: 2 раз
Автор: Масаня Перейти к цитате
У нас точно такая же задача,
Я использовал Крипто Про java-csp-5.0.42119-A,
код для cipher suite подходит вроде "кузнечик" - TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC


Да, я тоже выбрал эту версию. Читаю здесь, что нужно создать отдельное хранилище с сертом для кода из примеров. Хочу на их основе написать свое подключение. Что-то не пойму, как создать *.store файл из консоли. Вы проходили это?
Offline Масаня  
#4 Оставлено : 29 октября 2022 г. 12:33:33(UTC)
Масаня

Статус: Новичок

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

Я видимо немного по другому делал.
По ссылке речь идёт о trustStore,
Я его так настроил: зашёл на сайт со swagger-ом, который предоставляет гнивц, скачал их серт, достал из него корневой сертификат, конвертнул его в jks, из него сделал trust store:

Код:
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(...стрим-из-файла-jks, ...пароль-от-jks);
Offline ==fff==  
#5 Оставлено : 8 ноября 2022 г. 13:08:12(UTC)
==fff==

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.09.2022(UTC)
Сообщений: 35
Туркменистан

Сказал(а) «Спасибо»: 2 раз
Спасибо. Вроде с хранилищами разобрался. Теперь не могу побороть шифросьюты. Как я понял их нужно указать на этапе создания контекста ssl, потому что при создании клиента их уже не установить: перепробованные мной клиенты просто не знают ничего об этих шифросьютах.
Контекст создаю по примеру, найденному на форуме криптопро.
Цитата:

SSLContext sslContext = SSLContext.getInstance("GostTLS");

Метод getSupportedCipherSuites() говорит нам, что данный контекст поддерживает следующие шифросьюты:
  1. TLS_CIPHER_2012
  2. TLS_CIPHER_2001

Немного не то, что нам нужно. Подскажите пожалуйста, как Вы решали данный вопрос?
Offline Масаня  
#6 Оставлено : 9 ноября 2022 г. 19:31:49(UTC)
Масаня

Статус: Новичок

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

Я таким образом инициализировал context:

Код:
SSLContext context = SSLContext.getInstance("GostTLSv1.2", "JTLS");
context.init(keyManagers(), trustManagers(), null);


Может проблема в версии tls? По Вашей ссылке тоже используется версия 1.2

Шифросьюты прописываю при создании SSLConnectionSocketFactory
Offline ==fff==  
#7 Оставлено : 9 ноября 2022 г. 22:55:07(UTC)
==fff==

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.09.2022(UTC)
Сообщений: 35
Туркменистан

Сказал(а) «Спасибо»: 2 раз
Автор: Масаня Перейти к цитате
Я таким образом инициализировал context:

Код:
SSLContext context = SSLContext.getInstance("GostTLSv1.2", "JTLS");
context.init(keyManagers(), trustManagers(), null);


Может проблема в версии tls? По Вашей ссылке тоже используется версия 1.2

Шифросьюты прописываю при создании SSLConnectionSocketFactory


Указал явно v1.2 и попробовал создать фабрику ssl как Вы говорите.

Код:
SSLContext sslContext = SSLContext.getInstance("GostTLSv1.2", "JTLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(
        sslContext,
        new String[]{"TLSv1.2"}, // также пробовал null. На GostTLSv1.2 ругается
        new String[]{"TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC"}, // Здесь также пробовал шифросьюты из ТЗ вместе и по отдельности
        SSLConnectionSocketFactory.getDefaultHostnameVerifier()
);

HttpClientBuilder clientbuilder = HttpClients.custom();
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);
CloseableHttpClient httpclient = clientbuilder.build();
HttpGet httpget = new HttpGet("https://esf-test-dmz-webapi.gnivc.ru/front/v01/response-package");
HttpResponse httpresponse = httpclient.execute(httpget);


На текущий момент пишет
Код:
Unsupported ciphersuite TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC


Подскажите, что я не так делаю?
Offline Евгений Афанасьев  
#8 Оставлено : 10 ноября 2022 г. 13:21:06(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC есть только в GostTLSv1.2, но, например, в JCP подддержка появилась гораздо позже, чем в JCSP. Напишите, что используется - JCP или JCSP? Приведите версию используемого провайдера. В случае использования JCP/JCSP для java 10+, нужный провайдер должен быть провайдером по умолчанию, то есть его следует добавить в списке провайдеров выше другого: например, если требуется провайдер по умолчанию JCSP, то очередность вызовов должна быть такой:
Код:

Security.addProvider(new JCSP()); // первый
...
Security.addProvider(new JCP());
Offline ==fff==  
#9 Оставлено : 10 ноября 2022 г. 15:35:00(UTC)
==fff==

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.09.2022(UTC)
Сообщений: 35
Туркменистан

Сказал(а) «Спасибо»: 2 раз
Использовал JCP из пакета java-csp-5.0.40621-A. Только что импортировал JCSP. Теперь список провайдеров выглядит вот так:
Код:

Security.addProvider(new JCSP());
Security.addProvider(new JCP());
Security.addProvider(new CryptoProvider());
Security.addProvider(new RevCheck());
Security.addProvider(new ru.CryptoPro.ssl.Provider());

Запускаю под 11-й джавой. Проблема с шифросьютом актуальна: Unsupported ciphersuite TLS_GOSTR341112_256_WITH_28147_CNT_IMIT

По поводу протокола, то для получения контекста передаю GostTLSv1.2, но для SSLConnectionSocketFactory уже не могу его передать, так как возвращает Exception in thread "main" java.lang.IllegalArgumentException: GostTLSv1.2. Потому оставляю TLSv1.2.

Покажу код целиком, может заметите причину:
Код:

System.setProperty("com.sun.security.enableCRLDP", "true");

Security.addProvider(new JCSP());
Security.addProvider(new JCP());
Security.addProvider(new CryptoProvider());
Security.addProvider(new RevCheck());
Security.addProvider(new ru.CryptoPro.ssl.Provider());

KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
if (haveKeyAlias)
    keyStore.load(new StoreInputStream(keyAlias), null);
else
    keyStore.load(null, null);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
kmf.init(keyStore, password_to_key);

KeyStore ts = KeyStore.getInstance(trustedStoreName);

char[] tsPass = null;
if (!"null".equalsIgnoreCase(trustedStorePass)) {
    tsPass = trustedStorePass.toCharArray();
}

InputStream is = null;
if (!"null".equalsIgnoreCase(trustedStorePath)) {
    is = new FileInputStream(trustedStorePath);
}

ts.load(is, tsPass);

TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
tmf.init(ts);

X509TrustManager x509Tm = null;
for (TrustManager tm : tmf.getTrustManagers()) {
    if (tm instanceof X509TrustManager) {
        x509Tm = (X509TrustManager) tm;
        break;
    }
}

SSLContext sslContext = SSLContext.getInstance("GostTLSv1.2", "JTLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(
        sslContext,
        new String[]{"TLSv1.2"},
        new String[]{"TLS_GOSTR341112_256_WITH_28147_CNT_IMIT"},
        SSLConnectionSocketFactory.getDefaultHostnameVerifier()
);

HttpClientBuilder clientbuilder = HttpClients.custom();
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);
CloseableHttpClient httpclient = clientbuilder.build();
HttpGet httpget = new HttpGet("https://esf-test-dmz-webapi.gnivc.ru/front/v01/receipt-package");
HttpResponse httpresponse = httpclient.execute(httpget);
System.out.println(httpresponse.getStatusLine());

HttpEntity entity = httpresponse.getEntity();
if (entity != null) {
    System.out.println(EntityUtils.toByteArray(entity).length);
}


Может быть такое, что не тот провайдер подхватывает?
Offline Евгений Афанасьев  
#10 Оставлено : 11 ноября 2022 г. 9:49:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
1. Если нужен "TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC", то он появился уже после java-csp-5.0.40621-A и на тот момент (в первой сборке с поддержкой Кузнечика/Магмы) только в jcsp, а в jcp добавлен лишь недавно. Лучше брать последний релиз.
2. С таким именем "TLS_GOSTR341112_256_WITH_28147_CNT_IMIT" в jtls нет ciphersuite, в jtls имени "TLS_GOSTR341112_256_WITH_28147_CNT_IMIT" соответствует имя "TLS_CIPHER_2012", надо указывать его.
То есть либо с этой сборкой java-csp-5.0.40621-A нужно указать "TLS_CIPHER_2012", либо обновить сборку и тогда уже можно будет использовать "TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC".
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.