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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vdchernikov  
#1 Оставлено : 1 ноября 2019 г. 14:14:26(UTC)
vdchernikov

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

Группы: Участники
Зарегистрирован: 17.10.2019(UTC)
Сообщений: 11
Российская Федерация
Откуда: Ярославская обл.

Просим подсказать код для соединения по okhttp3 клиенту (если можно для двухфакторной аутентификации, как передать KeyManager)

Сделали рабочий код на HttpsURLconnection (Android 6.0)
соединение с тестовым сервером криптоПРО и с нашим (двустороння аутентификация) - работает

Теперь пробуем сделать на okhttp3 клиенте, даже с тестовым сервером КриптоПРО, но возникает ошибка

Unable to find acceptable protocols. isFallback=false, modes=[ConnectionSpec(cipherSuites=[TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA], tlsVersions=[TLS_1_3, TLS_1_2], supportsTlsExtensions=true), ConnectionSpec()], supported protocols=[TLSv1]

и потом

Unable to find acceptable protocols. isFallback=false, modes=[ConnectionSpec(cipherSuites=[TLS_CIPHER_2012, TLS_CIPHER_2001], tlsVersions=[TLS_1_3, TLS_1_2], supportsTlsExtensions=true)], supported protocols=[TLSv1]

Ниже примеры как мы делаем

Работающий наш пример

Код:
public Void DoHttpsConnect() throws Exception
    {
        HttpsURLConnection connection = null;
        int code = 0;
        Map<String, List<String>> headers;

        try {

            SSLContext sslContext = CreateKristaSSLContext();
            SSLSocketFactory sslFactory = sslContext.getSocketFactory();

            // SSLSocketFactory delegateFactory = new NoSSLv3SocketFactory(sslFactory);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslFactory);

            // URL url = new URL("https://cpca.cryptopro.ru/");
            // URL url = new URL("https://lk.budget.gov.ru/piao/");
            URL url = new URL("https://lk2012.budget.gov.ru/piao/");

            connection = InitBaseRequest(url);
            connection.connect();

            code = connection.getResponseCode();

            headers = connection.getHeaderFields();

        }
        catch (Exception exc)
        {
            String str = exc.getMessage();
        }
        finally {

            if (connection != null) {
                connection.disconnect();
            } // if

        }

        return null;
    }



Попытка сделать на Okhttp3

Код:
public Void DoOkHttpRequest()
    {
        try {

            URL url = new URL("https://cpca.cryptopro.ru/default.htm");

            SSLContext sslContext = CreateKristaSSLContext();
            SSLSocketFactory sslFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.followSslRedirects(false);

            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            builder.sslSocketFactory(sslFactory, (X509TrustManager) trustManagerFactory.getTrustManagers()[0]);

            // Задание необходимых параметров (сюиты, протокол).
            ConnectionSpec spec = new ConnectionSpec.Builder(
                    ConnectionSpec.MODERN_TLS)
                    .cipherSuites(
                            "TLS_CIPHER_2012",
                            "TLS_CIPHER_2001")
                    .build();

            builder.connectionSpecs(Collections.singletonList(spec));

            OkHttpClient httpOkClinet = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .build();

            // Обращение к серверу.
            Response response = httpOkClinet.newCall(request).execute();

            // Вывод полученного ответа.
            System.out.print(response.body().string());

            // keyManagerFactory.getKeyManagers()[0]
            // builder.addInterceptor();
        }
        catch (Exception exc)
        {
            String str = "";
        }

        return null;
    }



Заранее спасибо!

Отредактировано пользователем 1 ноября 2019 г. 14:49:13(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 3 ноября 2019 г. 11:40:40(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
Здравствуйте.
Посмотрите в последнем дистрибутиве, в ACSPClientApp (в исходниках в папке gradle/ACSPClientApp) есть пример работы с okhttp.

Отредактировано пользователем 3 ноября 2019 г. 11:41:13(UTC)  | Причина: Не указана

Offline vdchernikov  
#3 Оставлено : 4 ноября 2019 г. 15:18:41(UTC)
vdchernikov

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

Группы: Участники
Зарегистрирован: 17.10.2019(UTC)
Сообщений: 11
Российская Федерация
Откуда: Ярославская обл.

Здравстввуйте, пример этот я и использовал в качестве основы

D:\projects\android-csp-5.0.40424\javadoc\samples-sources\JTLS_samples\OkHTTPClientSample.java

но в нем непонятно что за параметры
Код:

// Задание необходимых параметров (сюиты, протокол).
        ConnectionSpec spec = new ConnectionSpec.Builder(
                ConnectionSpec.MODERN_TLS)
                .cipherSuites(
                        "TLS_CIPHER_2012",
                        "TLS_CIPHER_2001")
                .build();


и почему возникает такая ошибка у нас.
Свзяаться сначала пытаемся с сервером https://cpca.cryptopro.ru/default.htm
Offline Евгений Афанасьев  
#4 Оставлено : 4 ноября 2019 г. 16:11:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
А сам пример из дистрибутива работает?
Offline vdchernikov  
#5 Оставлено : 4 ноября 2019 г. 17:37:23(UTC)
vdchernikov

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

Группы: Участники
Зарегистрирован: 17.10.2019(UTC)
Сообщений: 11
Российская Федерация
Откуда: Ярославская обл.

В самом примере ACSPClientApp, в последнем дистрибутиве нету примеров с OkHTTPClient,
а тот который я нашел он просто лежит в каталоге android-csp-5.0.40424\javadoc\samples-sources\JTLS_samples
и нигде не используется;

В ACSPClientApp работает тольк пример через HttpUrlConnection с https://cpca.cryptopro.ru/default.htm;
а с OkHTTPClient нету
Offline Pavel Novikov  
#6 Оставлено : 22 июля 2020 г. 23:46:54(UTC)
Pavel Novikov

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

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

Здравствуйте. Столкнулся с той же самой проблемой (только с OkHttp4). Пример из sample проекта также не работает.

Правильно ли я понимаю, что нужно добавить корневые сертификаты в отдельно стоящее приложение КриптоПро CSP (через панель управления) и тогда рабочее приложение сможет их использовать?
Offline Евгений Афанасьев  
#7 Оставлено : 23 июля 2020 г. 17:37:54(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
Здравствуйте.
Можете приложить краткий пример, проект, чтобы воспроизвести проблему?
Offline Pavel Novikov  
#8 Оставлено : 24 июля 2020 г. 12:32:31(UTC)
Pavel Novikov

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

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

Вот sample проект: https://github.com/e13mort/crypto-sample

Я перенес в него несколько sample класса из sample проекта криптопро sdk.
Offline Евгений Афанасьев  
#9 Оставлено : 27 июля 2020 г. 12:24:16(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
I. По коду.

1) Я бы убрал System.setProperty из CryptoProApp.kt, по идее, оно ни к чему. Это статическое задание хранилища доверенных сертификатов, чаще всего используется как раз для HttpsURLConnection.
При этом вы не задали trustStoreStream в примере в MainActivity, но HttpURLConnection работает, потому что читает System.setProperty.

2) Нужно задать trustStoreStream в MainActivity перед созданием контекста.
Если не знаем, есть ли корневой cpca.cryptopro.ru в списке (вы к нему в примере подключаетесь), один раз пробуем его задать.
Код:

         val trusted_root_for_cpca = // <-- корневой cpca.cryptopro.ru
            "MIIDhzCCAvOgAwIBAgIRAnioGgH3qu28QYxppLJocdYwCgYIKoUDBwEBAwMwgbcx" +
            "IDAeBgkqhkiG9w0BCQEWEWNwY2FAY3J5cHRvcHJvLnJ1MQswCQYDVQQGEwJSVTEV" +
            "MBMGA1UECAwM0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJTAj" +
            "BgNVBAoMHNCe0J7QniAi0JrQoNCY0J/QotCeLdCf0KDQniIxMTAvBgNVBAMMKNCj" +
            "0KYg0JrQoNCY0J/QotCeLdCf0KDQniAo0JPQntCh0KIgMjAxMikwHhcNMTkxMDMx" +
            "MTY1OTA4WhcNMzQxMDMxMTY1OTA4WjCBtzEgMB4GCSqGSIb3DQEJARYRY3BjYUBj" +
            "cnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRUwEwYDVQQIDAzQnNC+0YHQutCy0LAx" +
            "FTATBgNVBAcMDNCc0L7RgdC60LLQsDElMCMGA1UECgwc0J7QntCeICLQmtCg0JjQ" +
            "n9Ci0J4t0J/QoNCeIjExMC8GA1UEAwwo0KPQpiDQmtCg0JjQn9Ci0J4t0J/QoNCe" +
            "ICjQk9Ce0KHQoiAyMDEyKTCBqjAhBggqhQMHAQEBAjAVBgkqhQMHAQIBAgEGCCqF" +
            "AwcBAQIDA4GEAASBgKmcZO/mbqp0F2nO5Ars3b/nOVJlezPUxAw+Y6w6CCZAViL1" +
            "u2FZujutdBd22EUWQiespuIaze8TJBsPRlThtSiqN4jVjCibIbLVO0ENEACKR84J" +
            "nmva2s0AvyOJkN3kWFUfxm4AXiHlD992IU63QuNk+Xk4QbqwLcAv7TTmcs8ho4GL" +
            "MIGIMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQULw8w7hsuk9ribYNd8CY2uBGU" +
            "ht0wDwYDVR0TAQH/BAUwAwEB/zARBgkrBgEEAYI3FAIEBAwCQ0EwEgYJKwYBBAGC" +
            "NxUBBAUCAwIAAjAfBgkrBgEEAYI3FQcEEjAQBggqhQMCAi4AAAIBAQIBADAKBggq" +
            "hQMHAQEDAwOBgQBG2v8I7rt963Gn4s92kLdcIf0Omfayj2UvE2Rn4hfjBs7QIrPV" +
            "8/t9jZO5plPylJuna6D56+XYkbBovS1RqSx2QaRiiKcTRUFBcDOAeatohNsj/pLp" +
            "lgTFrWS/qqaxd+uJlmlyvaTxRHuAkR2RwhGR4UcyZ6NWbtOGXWKU/l5bNg==";

        val adapter =
            ContainerAdapter(this, null, false)
        adapter.providerType = ProviderType.currentProviderType()
        adapter.connectionInfo = RemoteConnectionInfo.test
        adapter.trustStoreProvider = BouncyCastleProvider.PROVIDER_NAME
        adapter.trustStoreType = BKSTrustStore.STORAGE_TYPE
        adapter.trustStorePassword = BKSTrustStore.STORAGE_PASSWORD
        val trustStorePath =
            applicationInfo.dataDir.toString() + File.separator +
                    BKSTrustStore.STORAGE_DIRECTORY + File.separator + BKSTrustStore.STORAGE_FILE_TRUST

        val trustStore = KeyStore.getInstance(adapter.trustStoreType, adapter.trustStoreProvider);

        val trustFile = File(trustStorePath);
        trustStore.load(FileInputStream(trustFile), adapter.trustStorePassword);

        val cert_bin  = (Decoder()).decodeBuffer(trusted_root_for_cpca);
        val cert_root = CertificateFactory.getInstance("X.509").generateCertificate(ByteArrayInputStream(cert_bin));

        if (trustStore.getCertificateAlias(cert_root) == null) {
            Timber.i("Adding a new root certificate...");
            trustStore.setCertificateEntry("trusted_root_for_cpca", cert_root);
        }
        else {
            Timber.i("Certificate already exists.");
        }

        trustStore.store(FileOutputStream(trustFile), adapter.trustStorePassword);

        val trustStoreStream = FileInputStream(trustStorePath)
        adapter.trustStoreStream = trustStoreStream
        ...


3) нужно добавить строчку в пример с OkHttp:
Код:

        ConnectionSpec spec = new ConnectionSpec.Builder(
                ConnectionSpec.MODERN_TLS)
                .tlsVersions("TLSv1") // <---- видимо, в okhttp произошли изменения, добавили проверку протокола и принадлежности cipher suites
                .cipherSuites(
                    "TLS_CIPHER_2012",
                    "TLS_CIPHER_2001")
                .build();


II. По сборке.

1) У нас изменился способ хранения библиотек в SDK, в скором времени будет релиз. Теперь все библиотеки и ресурсы лежат в общей SharedLibrary.aar (jar, so, файлы лицензии и конфигов).

2) cpSSL.jar из JCP заменил cpSSL-android.jar, соответственно, изменился пакет: ru.CryptoPro.ssl.android -> ru.CryptoPro.ssl

Могу отправить изменения, чтобы вы посмотрели. Наша сборка - промежуточная, не релиз.
P.S. Сделал ветку https://github.com/afev/crypto-sample

Отредактировано пользователем 29 июля 2020 г. 10:43:27(UTC)  | Причина: Не указана

Offline armen.s  
#10 Оставлено : 28 июля 2020 г. 18:13:51(UTC)
armen.s

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

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте.
Взял сэмпл проект выше, добавил корневой сертификат cpca.cryptopro.ru в хранилище, и протокол TLSv1 в конфиг okhttp, но не удается соединиться:

Код:
ru.CryptoPro.JCSP.MSCAPI.MSHashNSignException: Key ERROR: 0x80090002


можете подсказать что это за ошибка?

вот логи okhttp.log (700kb) загружен 1 раз(а).

Заранее спасибо.
Offline Евгений Афанасьев  
#11 Оставлено : 28 июля 2020 г. 18:59:19(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
В данном проекте используется промежуточная сборка после последней с сайта. Промежуточная сборка содержит ошибку, которая уже была исправлена. Вероятно, эта сборка была выслана клиенту в рамках запроса в портале тех поддержки.
Offline armen.s  
#12 Оставлено : 28 июля 2020 г. 20:00:16(UTC)
armen.s

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

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

Сказал(а) «Спасибо»: 1 раз
а можно как-то получить доступ к исправленой версии? Angel
Offline Евгений Афанасьев  
#13 Оставлено : 29 июля 2020 г. 10:42:57(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
Попробуйте https://github.com/afev/crypto-sample
Тут используется промежуточная(!) сборка sdk.
В MainActivity прописан OkHttp пример.

Отредактировано пользователем 29 июля 2020 г. 11:27:50(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
armen.s оставлено 29.07.2020(UTC)
Offline armen.s  
#14 Оставлено : 29 июля 2020 г. 12:41:02(UTC)
armen.s

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

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

Сказал(а) «Спасибо»: 1 раз
Спасибо, все работает.
Offline Евгений Афанасьев  
#15 Оставлено : 29 июля 2020 г. 12:41:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
Когда будет выложена релизная сборка, sdk надо будет обновить.
Offline armen.s  
#16 Оставлено : 29 июля 2020 г. 12:45:11(UTC)
armen.s

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

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

Сказал(а) «Спасибо»: 1 раз
Да, конечно.
А когда примерно будет релиз?
Offline Евгений Афанасьев  
#17 Оставлено : 31 июля 2020 г. 8:47:59(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
Ориентировочно в августе.
Offline armen.s  
#18 Оставлено : 7 августа 2020 г. 16:55:36(UTC)
armen.s

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день, у меня появился еще один вопрос,
после инициализации CSPCConfig.initEx() или после вызова

Код:
Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509");
Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509");
Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.android.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.android.SSLServerSocketFactoryImpl");


чтобы подключиться к серверам с обычными SSL сертификатами, нужно вернуть значения по умолчанию. Есть ли другой способ, который позволит паралелльно создавать/использовать и обычный SSL контекст, и ГОСТ-овый?

при инизиализации TrustManagerFactory явно указывается GostX509, с этим проблем быть не должно. Дефолт KeyManagerFactory можно не указывать.
а вот можно ли без SocketFactory?


Спасибо

UPD: Как я понял, все эти параметры для клиентов, которые не принимают явно SSLContext и пр., а используют дефолтные. Так что можно и без них, если правильно проинициализировать клиент.

Отредактировано пользователем 7 августа 2020 г. 17:46:46(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#19 Оставлено : 7 августа 2020 г. 17:50:27(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 504 раз в 484 постах
Здравствуйте.
Обычно указанные параметры - это параметры для контекста по умолчанию: он создается, например, в HttpsURLConnection. Часто https-реализации используют нечто вроде SSLContext.getDefault(), который создаст контекст на основании заданных параметров.
Их можно задать А) программно в виде алгоритмов и использовать CSPConfig.init(), Б) можно использовать CSPConfig.initEx() и они будут заданы в нем, например, для HttpsURLConnection.
Если контекст SSLContext создается самостоятельно с указанием всех необходимых алгоритмов (GostTLS, GostX509), то параметры, задаваемые через Security.setProperty, не нужны. Практически все реализации https принимают либо SSLContext, либо SSLSocketFactory, которые можно успешно создать самостоятельно, с указанием алгоритмов, то есть Security.setProperty не нужен, можно использовать CSPConfig.init().

Отредактировано пользователем 7 августа 2020 г. 17:55:30(UTC)  | Причина: Не указана

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