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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline ==fff==  
#11 Оставлено : 11 ноября 2022 г. 11:12:21(UTC)
==fff==

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

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

Сказал(а) «Спасибо»: 2 раз
Спасибо. Попробую на JCSP из java-csp-5.0.42119-A.
Offline ==fff==  
#12 Оставлено : 11 ноября 2022 г. 14:36:20(UTC)
==fff==

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

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

Сказал(а) «Спасибо»: 2 раз
Спасибо большое. Последняя версия JCSP решила вопрос с подключением и сервер начал отвечать.
Правда теперь другая проблема. Судя по тексту ошибки мой сертификат не принимается.
Код:

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

возвращает
Код:

<div class="text-container">
    <h1 class="error-header">Oops!</h1>
    <p class="error-message"> A client has not presented the required certificate</p>
</div>
<p style="visibility: hidden; height: 0;">No required SSL certificate was sent</p>


Пробовал передавать сертификат в хранилище
Код:

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

        if (!keyStore.containsAlias(keyAlias)) {
            System.out.println("can't find required alias in keystore!");
            return;
        }

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

так и отдельным файлом
Код:

KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream keyInput = new FileInputStream(pathToPfx);
keyStore.load(keyInput, "1".toCharArray());
keyInput.close();
~~~~~~~~~~~~~
kmf.init(keyStore, "1".toCharArray());


В kmf.getKeyManagers() вижу свой серт. Но поведение ровно такое, как если бы я передал null или любой другой сертификат.

Сертификат корректный. Я под ним открываю сваггер сервиса ФНС.

Отредактировано пользователем 11 ноября 2022 г. 14:37:00(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#13 Оставлено : 11 ноября 2022 г. 15:45:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Правильный вариант только с "HDImageStore", в JCP нет поддержки PKCS12.
1. В ключевом контейнере xxxxxxxx.000 должен быть сертификат (если импортировали из PFX, то сертификата в контейнере может и не быть). Проверить можно в коде с помощью getCertificate(alias) (containsAlias не подходит, т.к. просто проверяет, есть ли такой ключевой контейнер) или в панели JCP на вкладке "Хранилища ключей и сертификатов", раскрыв нужный ключевой контейнер.
Если в ключевом контейнере точно есть сертификат, то возможные причины, которые привели к тому, что сертификат не был выбран:
2. задан неверный пароль password_to_key к ключевому контейнеру
3. пароль верный, но запуск выполняется под пользователем, не имеющим доступа к ключевому контейнеру
4. контейнер доступен, но истек срок сертификата
5. в сертификате нет политики "клиентская аутентификация"
6. сертификат не подходит по издателю - либо действительно не соответствует списку доверенных сертификатов сервера (из CertificateRequest), либо в ключевой контейнер надо установить всю цепочку сертификатов, а не один сертификат подписи, чтобы соответствовать списку доверенных сертификатов сервера
7. экзотическое - в сертификате имеются неизвестные критические расширения
8. экзотическое - имеется еще один ГОСТ java-провайдер, который перехватывает декодирование открытого ключа
Offline ==fff==  
#14 Оставлено : 11 ноября 2022 г. 22:37:04(UTC)
==fff==

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

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

Сказал(а) «Спасибо»: 2 раз
Евгений, видимо здесь нужен ликбез по сертификатам.

На данный момент смог отбросить следующие пункты:

  • В ключевом контейнере xxxxxxxx.000 должен быть сертификат (если импортировали из PFX, то сертификата в контейнере может и не быть). Проверить можно в коде с помощью getCertificate(alias) (containsAlias не подходит, т.к. просто проверяет, есть ли такой ключевой контейнер) или в панели JCP на вкладке “Хранилища ключей и сертификатов”, раскрыв нужный ключевой контейнер. – getCertificate(alias) возвращает необходимый сертификат, возможно просмотреть его инфо, в консоли JCP могу развернуть контейнер и увидеть мой сертификат, в каталоге /private/var/opt/cprocsp/keys/username/ лежат папки, соответствующие моим контейнерам в jcp и csp.
  • запуск выполняется под пользователем, не имеющим доступа к ключевому контейнеру – System.getProperty("user.name") возвращает моего пользователя
  • Контейнер доступен, но истек срок сертификата – срок сертификата не истек. Подтверждается датой истечения сертификата (январь 2023) и возможностью его использования для авторизации в swagger
  • не соответствует списку доверенных сертификатов сервера (из CertificateRequest) – полагаю этот пункт тоже не актуален, так как могу авторизоваться в swagger


Что не смог проверить:

  • задан неверный пароль password_to_key к ключевому контейнеру – сомневаюсь как должно быть.
    Код:
    keyStore.load(new StoreInputStream(keyAlias), password_to_key);
    

    сюда должен передаваться пароль от сертификата или кейстора? хранилище не запаролено, сертификат был тоже без пароля, но переустановил его с паролем "1" (в надежде, что в этом была проблема)
    Код:
    kmf.init(keyStore, password_to_key);
    

    соответственно пароль передаю и сюда, но не уверен, что это корректно.
    Пробовал по всякому: и с null, и с пустой строкой в разных комбинациях...
  • в сертификате нет политики “клиентская аутентификация” – как это проверить? Я исхожу из того, что раз этот сертификат подходит для авторизации в сваггере, значит он должен подойти и для авторизации через java приложение.
  • в ключевой контейнер надо установить всю цепочку сертификатов, а не один сертификат подписи, чтобы соответствовать списку доверенных сертификатов сервера – речь о keyStore? Когда я добавляю корневой сертификат через CSP, он появляется в группе Trusted Root Certification Authorities, что логично. Но не появляется в каталоге /private/var/opt/cprocsp/keys/username/ следовательно при загрузке keyStore не приходится надеяться, что корневой сертификат окажется подгружен. Как здесь правильно действовать? Через JCP я так и не разобрался как добавлять существующие сертификаты. Делаю все через CSP.
  • экзотическое - в сертификате имеются неизвестные критические расширения и экзотическое - имеется еще один ГОСТ java-провайдер, который перехватывает декодирование открытого ключа – до этого пока не добрался, оставлю экзотику на потом.


Исходя из вышесказанного на текущий момент мне видится самым логичным проблема либо с паролем, либо с отсутствием корневого сертификата.

Также прикладываю логи:
Код:
Nov 11, 2022 10:10:30 PM ru.CryptoPro.ssl.Provider b
INFO: JCP license isServer:  true
Nov 11, 2022 10:10:30 PM ru.CryptoPro.JCP.tools.Starter <init>
INFO: Loading JCP 2.0.42119-A
Init key store
Nov 11, 2022 10:10:31 PM ru.CryptoPro.JCP.tools.Starter <init>
INFO: JCP has been loaded.
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.cl_41 <init>
INFO: %% adding as private keys %%
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.cl_41 <init>
INFO: %% adding as private keys %%
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.cl_41 <init>
INFO: %% adding as private keys %%
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.cl_41 <init>
INFO: %% adding as private keys %%
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.cl_41 <init>
WARNING: %% No appropriate keys for handshake
PATH: /private/var/opt/cprocsp/keys/username/
Init trusted store
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl init.
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: trigger seeding of SecureRandom
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: done seeding SecureRandom
Nov 11, 2022 10:10:31 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl initialized.
22:10:31.992 [main] DEBUG org.apache.http.client.protocol.RequestAddCookies - CookieSpec selected: default
22:10:32.001 [main] DEBUG org.apache.http.client.protocol.RequestAuthCache - Auth cache not set in the context
22:10:32.002 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection request: [route: {s}->https://esf-test-dmz-webapi.gnivc.ru:443][total available: 0; route allocated: 0 of 2; total allocated: 0 of 20]
22:10:32.014 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection leased: [id: 0][route: {s}->https://esf-test-dmz-webapi.gnivc.ru:443][total available: 0; route allocated: 1 of 2; total allocated: 1 of 20]
22:10:32.015 [main] DEBUG org.apache.http.impl.execchain.MainClientExec - Opening connection {s}->https://esf-test-dmz-webapi.gnivc.ru:443
22:10:32.034 [main] DEBUG org.apache.http.impl.conn.DefaultHttpClientConnectionOperator - Connecting to esf-test-dmz-webapi.gnivc.ru/213.171.46.210:443
22:10:32.034 [main] DEBUG org.apache.http.conn.ssl.SSLConnectionSocketFactory - Connecting socket to esf-test-dmz-webapi.gnivc.ru/213.171.46.210:443 with timeout 0
22:10:32.124 [main] DEBUG org.apache.http.conn.ssl.SSLConnectionSocketFactory - Enabled protocols: [TLSv1.2]
22:10:32.125 [main] DEBUG org.apache.http.conn.ssl.SSLConnectionSocketFactory - Enabled cipher suites:[TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC]
22:10:32.125 [main] DEBUG org.apache.http.conn.ssl.SSLConnectionSocketFactory - Starting handshake
Nov 11, 2022 10:10:32 PM ru.CryptoPro.ssl.cl_41 a
WARNING: %% No alias is match
Nov 11, 2022 10:10:32 PM ru.CryptoPro.JCSP.Starter <init>
INFO: Loading Java CSP 5.0.42119-A
Nov 11, 2022 10:10:32 PM ru.CryptoPro.JCSP.Starter <init>
INFO: Java CSP has been loaded.
Offline Евгений Афанасьев  
#15 Оставлено : 11 ноября 2022 г. 23:49:24(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Цитата:

WARNING: %% No appropriate keys for handshake

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

kmf.init(keyStore, password_to_key);

Включите логирование, как тут https://support.cryptopr...lirovnija-kriptopro-jtls и приложите лог.
Offline ==fff==  
#16 Оставлено : 12 ноября 2022 г. 15:25:42(UTC)
==fff==

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

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

Сказал(а) «Спасибо»: 2 раз
С утра по логу увидел, что указан неправильный пароль (моя ошибка), после чего исправил и получил в логе
Код:
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake during web service communicaiton

Быстро решить вопрос не удалось потому оставил на потом, нужно было отойти.
После обеда продолжил, но этой ошибки уже не было. Вместо этого работа несколько раз висла на выполнении запроса, а теперь вернулась проблема с сертификатом. В логе поиском по warning вижу следующее:
Код:
Nov 12, 2022 3:17:48 PM ru.CryptoPro.ssl.cl_18 a
FINE: Warning: no suitable certificate found - continuing without client authentication
Nov 12, 2022 3:17:48 PM ru.CryptoPro.ssl.cl_18 a
FINE: Warning: no suitable certificate found - continuing without client authentication

Прикладываю лог
log.txt (407kb) загружен 3 раз(а).

Что за это время менялось? Я переключал страны в впн. Думал есть ограничения по некоторым из них. Больше ничего не делал.
Offline Евгений Афанасьев  
#17 Оставлено : 12 ноября 2022 г. 19:10:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
По логу, похоже, вам нужен ключ подписи и обмена, а в наличии только ключ подписи.
Offline ==fff==  
#18 Оставлено : 12 ноября 2022 г. 20:35:13(UTC)
==fff==

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

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

Сказал(а) «Спасибо»: 2 раз
Цитата:
По логу, похоже, вам нужен ключ подписи и обмена, а в наличии только ключ подписи.

Хмм... странно. Я с этим ключом в сваггере отправлял контейнер в ФНС.
Может быть такое, что сертификат в сваггере работает, а в java приложении не хочет?
Offline ==fff==  
#19 Оставлено : 15 ноября 2022 г. 9:31:01(UTC)
==fff==

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

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

Сказал(а) «Спасибо»: 2 раз
Да, в ФНС так и ответили. Сертификат рабочий, в сваггере установить соединение дает. А вот почему он на моей стороне не используется для подписания – вопрос ко мне. Разбираюсь дальше. Если есть мысли – буду рад выслушать.
Offline Евгений Афанасьев  
#20 Оставлено : 16 ноября 2022 г. 22:10:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Судя по логам, проблема в том, что для TLS используется ключ подписи на алгоритме ГОСТ 2012, он отбраковывается модулем cpSSL. Требуется ключ обмена. В будущих релизах добавим возможность использовать ключ подписи.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.