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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline long76  
#1 Оставлено : 21 апреля 2021 г. 16:28:24(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Есть два приложения:

1) Консольное(тестовое) приложение, где только КриптоПРО есть
2) Рабочее приложение(WildFly 8.21), в котором где-то как-то используется BC

При попытке отправки данных на первом приложении всё в порядке.

На втором во время отправки возникает ошибка java.security.cert.CertificateException: Invalid public key algorithm ECGOST3410-2012 in the certificate.

Как я понял КриптоПРО ожидает GOST3410-2012, а ECGOST3410-2012 чисто штука BC. Как отключить в коде BC, чтобы остался только КриптоПРО?
Пробовал
Код:
Security.removeProvider("BC");

не помогло. Заранее спасибо.

Версия JCP 2.0.41789

Отредактировано пользователем 22 апреля 2021 г. 12:48:30(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 22 апреля 2021 г. 17:48:03(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Здравствуйте.
Может, у вас где-то перестраивается список провайдеров с помощью Security.addProvider и в итоге BC может оказаться наверху?
Вряд ли WildFly будет использовать Security.insertProviderAt, чтобы вынести BC вперед, обычно используется Security.addProvider для добавления в конец списка.
Offline long76  
#3 Оставлено : 23 апреля 2021 г. 9:05:13(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Может, у вас где-то перестраивается список провайдеров с помощью Security.addProvider и в итоге BC может оказаться наверху?
Вряд ли WildFly будет использовать Security.insertProviderAt, чтобы вынести BC вперед, обычно используется Security.addProvider для добавления в конец списка.


Здравствуйте, судя по списку напечатанному с помощью
Код:
try {
    Provider[] providers = Security.getProviders();
    for (Provider provider : providers) {
        System.out.println(provider);
        for (Object key : provider.keySet())
            System.out.println("\t" + key);
    }
} catch (Exception e) {
    System.out.println(e.getMessage());
}

BC не в начале списка. Или вы имеете ввиду, что JCP оказывается после BC?
Offline Евгений Афанасьев  
#4 Оставлено : 23 апреля 2021 г. 9:31:38(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Да. Маловероятно, что wildfly перестраивает список или добавляет bc в начало. Скорее, где-то в вашем коде происходит удаление/добавление jcp, в результате чего bc оказывается сверху (главнее), над jcp.

Отредактировано пользователем 23 апреля 2021 г. 9:32:11(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 23.04.2021(UTC)
Offline long76  
#5 Оставлено : 4 августа 2021 г. 11:03:26(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Автор: Евгений Афанасьев Перейти к цитате
Да. Маловероятно, что wildfly перестраивает список или добавляет bc в начало. Скорее, где-то в вашем коде происходит удаление/добавление jcp, в результате чего bc оказывается сверху (главнее), над jcp.


здравствуйте, в процессе логирования выяснилось что в проект сертификаты парсятся с ключом в формате

Код:
  Key:  ECGOST3410-2012 Public Key [f4:88:08:c8:82:34:ca:44:ce:23:0c:01:34:1d:30:49:01:31:83:b7]
            X: d7b4272141e41b213322851aebc36f094de07fd6b8ba71ce3dc78c76e4aa8c39
            Y: fb0616a19cbbe14329877ad3ee3f3e80cb1982cb27df4b8d21545f71b72d7282


а должно быть

Код:
Key:  ru.CryptoPro.JCP.Key.GostPublicKey


можно ли как-то указать как обрабатывать ключи в сертификате?
Offline Евгений Афанасьев  
#6 Оставлено : 4 августа 2021 г. 11:07:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
1. Кем парсятся (в вашем коде или внутри wildlfy)? Обычно это место вроде KeyFactory keyFactory = KeyFactory.getInstance(...); PublicKey pk = keyFactory.generatePublic(...).
2. KeyFactory.getInstance без указания имени провайдера вторым аргументом приведет к тому, что будет выбрана реализация, умеющая работать с открытыми ГОСТ ключами того провайдера, который выше в списке провайдеров. И, видимо, им оказывается BC. Если п.1 выполняется в вашем коде, то вторым параметром KeyFactory.getInstance(...) можно прописать JCP.PROVIDER_NAME.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 04.08.2021(UTC)
Offline long76  
#7 Оставлено : 4 августа 2021 г. 14:29:15(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Автор: Евгений Афанасьев Перейти к цитате
1. Кем парсятся (в вашем коде или внутри wildlfy)? Обычно это место вроде KeyFactory keyFactory = KeyFactory.getInstance(...); PublicKey pk = keyFactory.generatePublic(...).
2. KeyFactory.getInstance без указания имени провайдера вторым аргументом приведет к тому, что будет выбрана реализация, умеющая работать с открытыми ГОСТ ключами того провайдера, который выше в списке провайдеров. И, видимо, им оказывается BC. Если п.1 выполняется в вашем коде, то вторым параметром KeyFactory.getInstance(...) можно прописать JCP.PROVIDER_NAME.


к сожалению пока не нашел такого места, но появился вопрос почему в криптопро нет CertificateFactory? можно было бы динамически загрузить сертификат с нужным PublicKey и добавить его в KeyStore.
Offline Евгений Афанасьев  
#8 Оставлено : 4 августа 2021 г. 15:03:55(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Пока необходимости в CertificateFactory не было.
Для CertificateFactory аналогично KeyFactory нужно было бы указывать провайдер, если требуется специфическая factory.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 04.08.2021(UTC)
Offline Евгений Афанасьев  
#9 Оставлено : 4 августа 2021 г. 18:49:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Можете полный стек ошибки приложить?
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 05.08.2021(UTC)
Offline long76  
#10 Оставлено : 5 августа 2021 г. 8:39:10(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Автор: Евгений Афанасьев Перейти к цитате
Можете полный стек ошибки приложить?


crypto.log (70kb) загружен 1 раз(а).
Offline long76  
#11 Оставлено : 5 августа 2021 г. 9:32:43(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
не подскажете какой KeySpec использовать?
Offline Евгений Афанасьев  
#12 Оставлено : 5 августа 2021 г. 10:08:59(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Автор: long76 Перейти к цитате
Автор: Евгений Афанасьев Перейти к цитате
Можете полный стек ошибки приложить?


crypto.log (70kb) загружен 1 раз(а).


1. JCP у вас JCP 2.0.41789?
2. SSLContext создается в вашем коде? Можете показать код?

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 05.08.2021(UTC)
Offline long76  
#13 Оставлено : 5 августа 2021 г. 10:24:15(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Автор: Евгений Афанасьев Перейти к цитате
Автор: long76 Перейти к цитате
Автор: Евгений Афанасьев Перейти к цитате
Можете полный стек ошибки приложить?


crypto.log (70kb) загружен 1 раз(а).


1. JCP у вас JCP 2.0.41789?
2. SSLContext создается в вашем коде? Можете показать код?



1. да
2. да

Код:
System.setProperty("com.sun.security.enableCRLDP", "true");

KeyStore ks;
try {
    ks = KeyStore.getInstance("HDImageStore", "JCP");
} catch (KeyStoreException e) {
    LOG.log(Level.SEVERE, "Ошибка чтения KeyStore с именем 'HDImageStore'", e);
    throw new RuntimeException(e);
} catch (NoSuchProviderException e) {
    LOG.log(Level.SEVERE, "Не установлен криптопровайдер JCP", e);
    throw new RuntimeException(e);
}
try {
    ks.load(null, null);
} catch (NoSuchAlgorithmException | CertificateException e) {
    LOG.log(Level.SEVERE, "Ошибка загрузки KeyStore с именем 'HDImageStore'", e);
    throw new RuntimeException(e);
}
KeyManagerFactory kmf;
try {
    kmf = KeyManagerFactory.getInstance("GostX509", "JTLS");
} catch (NoSuchAlgorithmException e) {
    LOG.log(Level.SEVERE, "Ошибка создания фабрики KeyManagerFactory 'GostX509'", e);
    throw new RuntimeException(e);
} catch (NoSuchProviderException e) {
    LOG.log(Level.SEVERE, "Не установлен криптопровайдер JTLS", e);
    throw new RuntimeException(e);
}
try {
    kmf.init(ks, "password".toCharArray());
} catch (KeyStoreException | NoSuchAlgorithmException | UnrecoverableKeyException e) {
    LOG.log(Level.SEVERE, "Ошибка инициализации фабрики KeyManagerFactory 'GostX509'", e);
    throw new RuntimeException(e);
}
KeyStore trustedKeyStore;
try {
    trustedKeyStore = KeyStore.getInstance("JKS", "SUN");
    trustedKeyStore.load(new FileInputStream(cacertsPath), cacertsPassword.toCharArray());
} catch (Exception e) {
    LOG.log(Level.SEVERE, String.format("Ошибка загрузки cacerts. Путь %s, пароль %s", cacertsPath, cacertsPassword), e);
    throw new RuntimeException(e);
}
TrustManagerFactory tmf;
try {
    tmf = TrustManagerFactory.getInstance("GostX509", "JTLS");
    tmf.init(trustedKeyStore);
} catch (Exception e) {
    LOG.log(Level.SEVERE, "Ошибка инициализации TrustManager", e);
    throw new RuntimeException(e);
}
SSLContext sslContext;
try {
    sslContext = SSLContext.getInstance("GostTLSv1.2", "JTLS");
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
    LOG.log(Level.SEVERE, "Окружение не поддерживает алгоритм шифрования GostTLSv1.2", e);
    throw new RuntimeException(e);
}
SecureRandom secureRandom;
try {
    secureRandom = SecureRandom.getInstance("CPRandom", "JCP");
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
    LOG.log(Level.SEVERE, "Ошибка инициализации SecureRandom 'CPRandom'", e);
    throw new RuntimeException(e);
}
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
Offline Евгений Афанасьев  
#14 Оставлено : 5 августа 2021 г. 13:17:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Код верный, но сертификаты в логе, видимо, все представлены BC. Можете включить полное (ALL) логирование для SSLLogger и JCPLogger до момента возникновения ошибки?
https://support.cryptopr...nlirovnija-kriptopro-jcp
https://support.cryptopr...lirovnija-kriptopro-jtls
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 19.08.2021(UTC)
Offline long76  
#15 Оставлено : 19 августа 2021 г. 15:37:27(UTC)
long76

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

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

Сказал(а) «Спасибо»: 8 раз
Автор: Евгений Афанасьев Перейти к цитате
Код верный, но сертификаты в логе, видимо, все представлены BC. Можете включить полное (ALL) логирование для SSLLogger и JCPLogger до момента возникновения ошибки?
https://support.cryptopr...nlirovnija-kriptopro-jcp
https://support.cryptopr...lirovnija-kriptopro-jtls


Логирование особо не помогло, проблему решили выносом функционала в jar и дергание его через Runtime.exec. Но спасибо за помощь.
Offline Евгений Афанасьев  
#16 Оставлено : 19 августа 2021 г. 17:20:21(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Если у вас имеется полный лог, приложите, пожалуйста.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.