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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline imgen  
#1 Оставлено : 18 мая 2021 г. 19:29:40(UTC)
imgen

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

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

Добрый день, подскажите, какие пакеты необходимо подключать, желательно бы maven.
Получаю ошибку о ненайденном классе:
Цитата:
Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/cms/CMSException
at com.company.Main.main(Main.java:106)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.cms.CMSException

Вот код:
Код:

PrivateKey privateKey = (PrivateKey) ks.getKey( alias, keystorePass.toCharArray() );

        X509Certificate cert = (X509Certificate) ks.getCertificate( alias );
        List<X509Certificate> chain = Arrays.asList( cert );
        //new sign
        CAdESSignature cadesSignature = new CAdESSignature( true );

        //add certs in sign
        Collection<X509CertificateHolder> holderList = new ArrayList<X509CertificateHolder>();
        for (X509Certificate cert1 : chain)
        {
            holderList.add(new X509CertificateHolder(cert1.getEncoded()));
        }
        cadesSignature.setCertificateStore(new CollectionStore(holderList));

Пробовал подключать org.bouncycastle:bcpkix-jdk15on различных версий, но безрезультатно.
Offline Евгений Афанасьев  
#2 Оставлено : 18 мая 2021 г. 20:42:43(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Здравствуйте. В папке dependencies дистрибутива jcp лежат библиотеки bc, в имени файлов есть версии, которые можно указать для maven. Если дистрибутив jcp из последних, то может быть bc 1.60.
Offline imgen  
#3 Оставлено : 18 мая 2021 г. 21:17:54(UTC)
imgen

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

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

В скачанной версии с оффициального сайта в папке зависимостей лежит bcpkix-jdk15on-1.50. Подключение его, да и всех остальных jar не дает нужного результата. Из maven версия 1.60 так же не помогает.
Offline Евгений Афанасьев  
#4 Оставлено : 18 мая 2021 г. 21:26:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Автор: imgen Перейти к цитате
В скачанной версии с оффициального сайта в папке зависимостей лежит bcpkix-jdk15on-1.50.

Значит, такая и должна быть использована. Возможно, у вас подключена также другая версия (или лежит в lib/ext, или иначе).
Offline imgen  
#5 Оставлено : 27 мая 2021 г. 21:01:57(UTC)
imgen

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

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

Для тех, кто столкнется с такой ошибкой. Необходимо скопировать самостоятельно все пакеты bc в папку jre/lib/ext/
Offline Nikita.Mikhailov  
#6 Оставлено : 23 августа 2021 г. 17:10:30(UTC)
Nikita.Mikhailov

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

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

А есть способ использовать bouncycastle из maven?
Offline Евгений Афанасьев  
#7 Оставлено : 23 августа 2021 г. 21:36:40(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Автор: Nikita.Mikhailov Перейти к цитате
А есть способ использовать bouncycastle из maven?

Вы имеете в виду не класть в lib/ext? С версией JCP 2.0-A для java 10+.

Offline Nikita.Mikhailov  
#8 Оставлено : 23 августа 2021 г. 21:57:52(UTC)
Nikita.Mikhailov

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

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

Цитата:
Вы имеете в виду не класть в lib/ext?


Да, именно. Но почему-то не получается поднять в java 11 + tomcat 9.
Пока удалось перенесением библиотек bouncycastle в папку /tomcat/lib

Тоесть, если так не делать будет ошибка, что класс не найден, хотя он есть в WEB-INF/lib, но почему-то не подгружается.
Offline basid  
#9 Оставлено : 24 августа 2021 г. 7:32:02(UTC)
basid

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 110 раз в 99 постах
У сервлет-контейнера есть три класс-путя (Котяра):
1. Системный (устанавливается перед запуском JVM);
2. Серверный CATALINA.HOME;
3. Экземпляра CATALINA.BASE.
Плюс - контексты "приложений" сайта.
Так вот, размещать "глобальные" классы в контексте приложения - плохая идея. Плохая по целому ряду причин, включая недоступность прикладного контекста в контексте экземпляра.
Offline Nikita.Mikhailov  
#10 Оставлено : 24 августа 2021 г. 12:43:26(UTC)
Nikita.Mikhailov

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

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

В полне подозреваю, что я что-то не понимаю, но тем не менее спасибо за ответ.

Просто в документации tomcat 9 указывается порядок работы classloader - https://tomcat.apache.or.../class-loader-howto.html

Цитата:

Bootstrap classes of your JVM
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
System class loader classes (described above)
Common class loader classes (described above)


Тоесть классы из /WEB-INF/lib таки грузятся, но в моём случае грузятся не все что нужны.

Получается из вашего комментария, для того чтобы bouncycastle работал из maven, мне и все JCP библиотеки нужно перенести в WEB-INF/lib, чтобы соблюсти области видимости?
Offline Евгений Афанасьев  
#11 Оставлено : 24 августа 2021 г. 12:46:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Автор: Nikita.Mikhailov Перейти к цитате
все JCP библиотеки нужно перенести в WEB-INF/lib

А вы их не туда положили? В WEB-INF/lib должен быть JCP (версии А) с нужными зависимостями (BC) и т.д.

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

Offline Nikita.Mikhailov  
#12 Оставлено : 24 августа 2021 г. 12:51:38(UTC)
Nikita.Mikhailov

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

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

А как тогда лицензировать?

Я конечно не эксперементировал, но, думается если я буду собирать приложение с JCP библиотеками с серверной лицензией, оно же не будет работать на локальной машине?

Сейчас JCP библиотеки лежат в отдельной директории и tomcat classloader настроен так чтобы сканировать и загружать классы из этой дирректории. Таким образом я могу иметь отдельный JCP с сервеной лицензией на сервере и JCP с лицензией на рабочее место на локальной машине.
Offline Евгений Афанасьев  
#13 Оставлено : 24 августа 2021 г. 12:55:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Вы на одной машине используете -Djava.util.prefs.systemRoot=<...> -Djava.util.prefs.userRoot=<...> для того, чтобы задавать разные лицензии для разных случаев?

Отредактировано пользователем 24 августа 2021 г. 12:56:45(UTC)  | Причина: Не указана

Offline Nikita.Mikhailov  
#14 Оставлено : 24 августа 2021 г. 12:58:39(UTC)
Nikita.Mikhailov

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

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

Нет, первый раз вижу это. Подскажите, пожалуйста, информация об этом есть где-то в документации?
Offline Евгений Афанасьев  
#15 Оставлено : 24 августа 2021 г. 13:36:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
В документации явно не прописано, но можно поискать в интернете. В *nix работает автоматически: так можно указать место, где хранятся Preferences, отличное от дефолтного. Для Windows (тут Preferences всегда хранятся в реестре) мы тоже добавляли в JCP (чтобы можно было, как в *nix, хранить Preferences в папке).
У этих параметров есть особенности - если не ошибаюсь, пути надо задавать так (my_dir - это любая папка):
Код:

-Djava.util.prefs.systemRoot=/my_dir/.java
-Djava.util.prefs.userRoot=/my_dir

При этом папки /my_dir/.java/.systemPrefs и /my_dir/.java/.userPrefs должны существовать на момент запуска, иначе при отсутствии .systemPrefs они будут созданы в другом месте по усмотрению jdk (в /etc/.java, в папке jdk и т.п.). Нюансы (если интересно) можно посмотреть в исходном коде open jdk (поиск по java.util.prefs.systemRoot).

Отредактировано пользователем 24 августа 2021 г. 13:44:15(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Санчир Момолдаев оставлено 25.08.2021(UTC)
Offline basid  
#16 Оставлено : 26 августа 2021 г. 6:34:27(UTC)
basid

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 110 раз в 99 постах
Автор: Nikita.Mikhailov Перейти к цитате
Цитата:
Bootstrap classes of your JVM
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
System class loader classes (described above)
Common class loader classes (described above)
Тоесть классы из /WEB-INF/lib таки грузятся, но в моём случае грузятся не все что нужны.
Кроме "грузятся" есть ещё и "область видимости".
В сервлет-контейнере ограничена область видимости классов, загруженных в контексте приложения (app/WEB-INF/lib).
Контексты развёртываются "в самом конце" загрузки контейнера и могут выгружаться без перезагрузки контейнера в целом. Далеко не всякий класс/jar может работать в таких условиях.

Чтобы не иметь проблем - помечайте классы JCP как "предоставляются при работа" (provided, если не ошибаюсь) и отдельно устанавливайте JCP в нужных JRE. Это будет "bootstrap class loader".
Или настраивайте CLASSPATH для JCP из скрипта запуска "Котяры" (это будет "system class loader").
Или размещайте JCP в "common class loader" (${CATALINA_BASE}/lib).
Два последних варианта, если я правильно понимаю, работают только в JCP 2.0A.

В общем - не надо упаковывать в приложение всё, что ему необходимо для работы. Некоторые вещи в таком варианте распространения или вообще не будут работать или не будут работать корректно.
thanks 2 пользователей поблагодарили basid за этот пост.
two_oceans оставлено 26.08.2021(UTC), Евгений Афанасьев оставлено 14.09.2021(UTC)
Offline Nikita.Mikhailov  
#17 Оставлено : 26 августа 2021 г. 13:26:02(UTC)
Nikita.Mikhailov

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

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

Спасибо за развёрнутый комментарий.

Пока сделал почти так
Цитата:
Или размещайте JCP в "common class loader" (${CATALINA_BASE}/lib)

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