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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline revenkovmv  
#1 Оставлено : 5 июля 2017 г. 12:12:05(UTC)
revenkovmv

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

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

Добрый день. Уже довольно долго бьюсь над проблемой интеграции с ГИС ЖКХ, и на данном этапе решил просто собрать предлагаемое решение "signature-demo-master", которое использует комбинацию JCP и Trusted Java (прошу прощения, но мой опыт разработки в среде Java крайне мал).
Итак, собираю решение - без ошибок, однако, при запуске получаю ошибку:
Цитата:
xades4j.XAdES4jXMLSigException: com.digt.trusted.jce.provider.JDKGOST3410ELPrivateKey cannot be cast to ru.CryptoPro.JCP.Key.InternalGostPrivateKey


полный код ошибки:
Цитата:
xades4j.XAdES4jXMLSigException: com.digt.trusted.jce.provider.JDKGOST3410ELPrivateKey cannot be cast to ru.CryptoPro.JCP.Key.InternalGostPrivateKey
at xades4j.production.SignerBES.sign(SignerBES.java:263)
at ru.gosuslugi.dom.signature.demo.commands.SignCommand.execute(SignCommand.java:130)
at ru.gosuslugi.dom.signature.demo.Main.main(Main.java:56)
Caused by: org.apache.xml.security.signature.XMLSignatureException: com.digt.trusted.jce.provider.JDKGOST3410ELPrivateKey cannot be cast to ru.CryptoP
ro.JCP.Key.InternalGostPrivateKey
Original Exception was java.security.InvalidKeyException: com.digt.trusted.jce.provider.JDKGOST3410ELPrivateKey cannot be cast to ru.CryptoPro.JCP.Key
.InternalGostPrivateKey
at com.digt.trusted.xmlsig.SignatureStraightGostR34102001GostR3411.engineInitSign(Unknown Source)
at org.apache.xml.security.algorithms.SignatureAlgorithm.initSign(SignatureAlgorithm.java:239)
at org.apache.xml.security.signature.XMLSignature.sign(XMLSignature.java:606)
at xades4j.production.SignerBES.sign(SignerBES.java:259)
... 2 more
Caused by: java.security.InvalidKeyException: com.digt.trusted.jce.provider.JDKGOST3410ELPrivateKey cannot be cast to ru.CryptoPro.JCP.Key.InternalGos
tPrivateKey
at ru.CryptoPro.JCP.Key.InternalGostPrivateKey.extractSpec(Unknown Source)
at ru.CryptoPro.JCP.Sign.cl_0.engineInitSign(Unknown Source)
at java.security.Signature.initSign(Signature.java:527)
... 6 more
Caused by: java.lang.ClassCastException: com.digt.trusted.jce.provider.JDKGOST3410ELPrivateKey cannot be cast to ru.CryptoPro.JCP.Key.InternalGostPriv
ateKey
... 9 more


Работаю под Windows 10 x64, Java SE 8, установлен пакет крипто-про, jcp-2.0.39014, Trusted Java 2.0, ну и соответственно, необходимые зависимости.

Помогите пожалуйста разобраться, т.к. полагаю, что в данном месте возникает конфликт версий JCP и Trusted Java.
Offline Евгений Афанасьев  
#2 Оставлено : 5 июля 2017 г. 14:03:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Да, при нескольких провайдерах, реализующих схожий функционал и алгоритмы, могут быть проблемы. Как вы читаете ключ и используете? Может быть, вы читаете его с помощью, допустим, keyStore.getInstance("HDImageStore"), а передаете в какой-то сторонний провайдер (библиотеку)? Тогда и читать вы должны, по идее, с помощью этого стороннего провайдера, т.к. в коде есть проверки класса ключа.
Offline revenkovmv  
#3 Оставлено : 6 июля 2017 г. 7:47:01(UTC)
revenkovmv

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

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

Да, ключ получается с помощью getInstance()
Цитата:
KeyStore keyStore = KeyStore.getInstance(parameters.getStoreType(), provider);

А провайдеры используются эти:
Цитата:
// создаем провайдер, описывающий используемые алгоритмы
CustomizableAlgorithmProvider algorithmsProvider = new CustomizableAlgorithmProvider();
algorithmsProvider.setSignatureAlgorithm(Consts.SIGNATURE_ALGORITHM);
algorithmsProvider.setCanonicalizationAlgorithmForSignature(Consts.CANONICALIZATION_ALGORITHM_FOR_SIGNATURE);
algorithmsProvider.setCanonicalizationAlgorithmForTimeStampProperties(Consts.CANONICALIZATION_ALGORITHM_FOR_TIMESTAMP_PROPERTIES);
algorithmsProvider.setDigestAlgorithmForDataObjsReferences(Consts.DIGEST_ALGORITHM_URI);
algorithmsProvider.setDigestAlgorithmForReferenceProperties(Consts.DIGEST_ALGORITHM_URI);
algorithmsProvider.setDigestAlgorithmForTimeStampProperties(Consts.DIGEST_ALGORITHM_URI);


Цитата:
// создаем провайдер, ответственный за расчет хешей
MessageDigestEngineProvider messageDigestEngineProvider = new CustomizableMessageDigestEngineProvider(Consts.DIGEST_ALGORITHM_NAME, provider);


Цитата:
// настраиваем профиль подписания
XadesSigningProfile profile = new CustomizableXadesBesSigningProfileFactory()
.withKeyingProvider(kp)
.withAlgorithmsProvider(algorithmsProvider)
.withMessageDigestEngineProvider(messageDigestEngineProvider)
.create();


Цитата:
// создаем объект, ответственный за создание подписи
XadesSigner signer = profile.newSigner();


К сожалению, глубоко в этот код закопаться не могу. А есть более простой метод подписания, используя именно возможности JCP и удовлетворяющие требованиям ШИ ЖКХ? Или какой нибудь работающий пример?

Да, еще вопрос - возможно ли поставить JCP 1.0.5 по Win 10, CryptoPro 4, Java SE 8? Заранее спасибо.
Offline Евгений Афанасьев  
#4 Оставлено : 6 июля 2017 г. 9:31:26(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Что находится в parameters.getStoreType() и provider и чьи классы CustomizableAlgorithmProvider, Consts, MessageDigestEngineProvider - неизвестно. Повторю, что вы используется 2 провайдера, реализующих работу с ключами и подписью: JCP и Trusted Java, при этом ключ, судя по всему, вы загружаете с помощью одного, а при подписи передаете его в класс (реализующий подпись) другого провайдера, где есть проверка ключа на принадлежность своему классу (instanseof).
jcp 1.0 установить в java 8 не выйдет (только java 6-7), jcp 2.0 в java 8 установить можно.
Есть некоторое количество примеров подписи в samples-sources.jar, в папках JCPxml и xmlSign (подпись XML документа), папке xades (XAdES подпись с помощью xades4j и XAdES.jar), папке wss4j (подпись с использованием библиотеки wss4j). Посмотрите их.

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

Offline revenkovmv  
#5 Оставлено : 6 июля 2017 г. 9:57:00(UTC)
revenkovmv

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

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

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