Статус: Активный участник
Группы: Участники
Зарегистрирован: 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. После погуглил по указанным шифросьютам и пришел на форум КриптоПро. Подскажите пожалуйста, правильно понимаю, что подключение с данными шифросьютами возможны реализовать только с либами КриптоПро?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.10.2022(UTC) Сообщений: 3
|
У нас точно такая же задача, Я использовал Крипто Про java-csp-5.0.42119-A, код для cipher suite подходит вроде "кузнечик" - TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.09.2022(UTC) Сообщений: 35 Сказал(а) «Спасибо»: 2 раз
|
Автор: Масаня У нас точно такая же задача, Я использовал Крипто Про java-csp-5.0.42119-A, код для cipher suite подходит вроде "кузнечик" - TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC
Да, я тоже выбрал эту версию. Читаю здесь, что нужно создать отдельное хранилище с сертом для кода из примеров. Хочу на их основе написать свое подключение. Что-то не пойму, как создать *.store файл из консоли. Вы проходили это?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.10.2022(UTC) Сообщений: 3
|
Я видимо немного по другому делал. По ссылке речь идёт о trustStore, Я его так настроил: зашёл на сайт со swagger-ом, который предоставляет гнивц, скачал их серт, достал из него корневой сертификат, конвертнул его в jks, из него сделал trust store: Код:KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(...стрим-из-файла-jks, ...пароль-от-jks);
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.09.2022(UTC) Сообщений: 35 Сказал(а) «Спасибо»: 2 раз
|
Спасибо. Вроде с хранилищами разобрался. Теперь не могу побороть шифросьюты. Как я понял их нужно указать на этапе создания контекста ssl, потому что при создании клиента их уже не установить: перепробованные мной клиенты просто не знают ничего об этих шифросьютах. Контекст создаю по примеру, найденному на форуме криптопро. Цитата: SSLContext sslContext = SSLContext.getInstance("GostTLS");
Метод getSupportedCipherSuites() говорит нам, что данный контекст поддерживает следующие шифросьюты: - TLS_CIPHER_2012
- TLS_CIPHER_2001
Немного не то, что нам нужно. Подскажите пожалуйста, как Вы решали данный вопрос?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.10.2022(UTC) Сообщений: 3
|
Я таким образом инициализировал context: Код:SSLContext context = SSLContext.getInstance("GostTLSv1.2", "JTLS");
context.init(keyManagers(), trustManagers(), null);
Может проблема в версии tls? По Вашей ссылке тоже используется версия 1.2 Шифросьюты прописываю при создании SSLConnectionSocketFactory
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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
Подскажите, что я не так делаю?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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());
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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);
}
Может быть такое, что не тот провайдер подхватывает?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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". |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close