logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dmitry2019_2019  
#1 Оставлено : 15 февраля 2020 г. 12:57:42(UTC)
Dmitry2019_2019

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

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

Здравствуйте. Прошу помочь разобраться с причиной ошибки handshake. Сделал по аналогии с вашим примером.


Код:

        HttpPost httpPost = new HttpPost("https://api.sb.mdlp.crpt.ru/api/v1/documents/income");
        httpPost.setEntity(new StringEntity(body.toString(), ContentType.APPLICATION_JSON));
        httpPost.setHeader("Authorization", "token " + token.getToken());
        httpPost.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);

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

        //noinspection resource,IOResourceOpenedButNotSafelyClosed
        PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
               poolingConnectionManager.setDefaultSocketConfig(
                SocketConfig
                        .custom()
                        .setTcpNoDelay(true)
                        .setSoTimeout(900000)
                        .build());

        SSLConfiguration sslConfig = new SSLConfiguration(
                "HDImageStore",
                "C:\\uc_cert",
                "123456".toCharArray(),
                false,//auth,
                "HDImageStore",
                "null",   //                keyStoreAlias,
                "123456".toCharArray()
        );

        SSLConnector connector = new SSLConnector(sslConfig);
        connector.prepare(false);

        SSLContext sslContext = connector.create("TLSv1");

        HttpClient httpsClient = HttpClients.custom()
                .setConnectionManager(poolingConnectionManager)
                .disableAutomaticRetries()
                .setDefaultRequestConfig(
                        RequestConfig
                                .custom()
                                .setCircularRedirectsAllowed(true)
                                .setSocketTimeout(900000)
                                .setExpectContinueEnabled(false)
                                .setConnectTimeout(60000)
                                .setConnectionRequestTimeout(900000)
                                .build())
                .setRequestExecutor(new HttpRequestExecutor())
                .setRedirectStrategy(new DefaultRedirectStrategy())
                .setSSLContext(sslContext)
                .build();

        HttpResponse response;
        String content;
        try {
            response = httpsClient.execute(httpPost);
            content = readInputStream(response.getEntity().getContent());
        } catch (IOException e) {
            throw new InternalErrorException(e);
        }


Получаю ошибку handshake_failure, прилогаю файл с логом log.txt (30kb) загружен 2 раз(а).

Отредактировано пользователем 15 февраля 2020 г. 21:06:57(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 15 февраля 2020 г. 14:49:52(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 461 раз в 443 постах
Здравствуйте.
В стеке ошибки нет упоминания JCP или cpSSL: пакет ru.CryptoPro.ssl. Возможно, в конфигурации надо где-то указать протокол "GostTLS", алгоритмы менеджеров ключей и хранилища сертификатов - "GostX509" (см. рук-во разработчика JTLS). В логе используются стандартные, sun алгоритмы и протоколы, в отправляемом клиентом ClientHello нет ГОСТ алгоритмов, сервер его не понимает и дает ошибку.
Offline Dmitry2019_2019  
#3 Оставлено : 16 февраля 2020 г. 9:28:41(UTC)
Dmitry2019_2019

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

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

Вопрос решился когда я заменил
.setSSLContext(sslContext)
на
.setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext))

и убрал .setConnectionManager(poolingConnectionManager)
Получается крипто про не может работать с многопоточными запросами?

Работающий код после изменений:
Код:
httpsClient = HttpClients.custom()
                .disableAutomaticRetries()
                .setDefaultRequestConfig(
                        RequestConfig
                                .custom()
                                .setCircularRedirectsAllowed(true)
                                .setSocketTimeout(SOCKET_TIMEOUT)
                                .setExpectContinueEnabled(false)
                                .setConnectTimeout(CONNECTION_TIMEOUT_MS)
                                .setConnectionRequestTimeout(SOCKET_TIMEOUT)
                                .build())
                .setDefaultHeaders(DEFAULT_HEADERS)
                .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext))
                .build();
Offline Евгений Афанасьев  
#4 Оставлено : 16 февраля 2020 г. 11:44:34(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 461 раз в 443 постах
Cpssl реализует только ГОСТ алгоритмы в tls соединении и предоставляет ssl контекст (с фабрикой сокетов), который позволяет использовать данные ГОСТ алгоритмы, более он ничего не делает (пулы, многопоточность, работа с сокетами - это уже другой уровень, не связанный с cpssl или tls, и он зависит уже от реализации работы с сокетами и т.п. внутри той библиотеки, что вы используете). Cpssl работает с любыми запросами, они просто шифруются и передаются по назначению, параллельно это делать или нет - задача http библиотеки.

Отредактировано пользователем 16 февраля 2020 г. 13:04:19(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.