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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline bankir1980  
#1 Оставлено : 20 декабря 2012 г. 12:25:38(UTC)
bankir1980

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

Группы: Участники
Зарегистрирован: 20.12.2012(UTC)
Сообщений: 29
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Пишу код подписывания xml для СМЭВ

Столкнулся с ошибкой...

[codelang]
дек 20, 2012 11:47:14 AM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.53
дек 20, 2012 11:47:14 AM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: java.security.InvalidKeyException: sun.security.rsa.RSAPrivateCrtKeyImpl cannot be cast to ru.CryptoPro.JCP.Key.GostPrivateKey
at ru.CryptoPro.JCPxml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:385)
at test.smev.main.main(main.java:308)
[/codelang]

Подозреваю из-за отсутствия в коде
if(!JCPXMLDSigInit.isInitialized()) {
JCPXMLDSigInit.init();
}


Но если я его включаю в код, начинает ругаться на

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.xml.security.keys.KeyInfo.init()

использую xmlsec-1.5.3.jar из пакета wss4j, скаченного по ссылке из блога с примером работы со СМЭВ

пробовал скачать xmlseс.jar из инета, начинает ругаться на другие отсутствующие классы из другого пакета. Скачал раннюю версию этого пакета с нужным классом (в последней версии нет такого класса), начинает орать на 3-й класс и так далее.

Просто замкнутый круг какой то.


Offline bankir1980  
#2 Оставлено : 20 декабря 2012 г. 12:29:02(UTC)
bankir1980

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

Группы: Участники
Зарегистрирован: 20.12.2012(UTC)
Сообщений: 29
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Кстати,

вот на этом коде валится
KeyInfoFactory kif = fac.getKeyInfoFactory();
X509Data x509d = kif.newX509Data(Collections.singletonList((X509Certificate) cert));
javax.xml.crypto.dsig.keyinfo.KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));

А еще сертификат заюзал левый, валяется у меня тут в jks хранилище сертификатик один для работы с Юнистрим.
Пока сертификата для полноценного тестирования СМЭВ нет.
Может с этим связано возникновение первой ошибки?
Offline Евгений Афанасьев  
#3 Оставлено : 20 декабря 2012 г. 12:53:19(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Здравствуйте.

Автор: bankir1980 Перейти к цитате

Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: java.security.InvalidKeyException: sun.security.rsa.RSAPrivateCrtKeyImpl cannot be cast to ru.CryptoPro.JCP.Key.GostPrivateKey
at ru.CryptoPro.JCPxml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:385)
at test.smev.main.main(main.java:308)


Значит, закрытый ключ у вас на алгоритме RSA, а в SignatureMethod вы передаете ГОСТ.

Для инициализации следует использовать

Код:

com.sun.org.apache.xml.internal.security.Init.init();
if(!JCPXMLDSigInit.isInitialized()) {
    JCPXMLDSigInit.init();
}


JCP формат jks не поддерживает.

Проверьте, возможно, где-то подключен xmlsec более старой версии, 1.4.

Отредактировано модератором 20 декабря 2012 г. 13:48:15(UTC)  | Причина: Не указана

Offline bankir1980  
#4 Оставлено : 20 декабря 2012 г. 13:26:23(UTC)
bankir1980

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

Группы: Участники
Зарегистрирован: 20.12.2012(UTC)
Сообщений: 29
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Да, ключ в jks хранилище на RSA

Certificate fingerprints:
MD5: 4A:1B:8B:F0:2A:7F:51:7E:E6:18:81:8C:EC:45:84:6E
SHA1: D1:C7:10:7F:A6:99:E6:15:C7:8B:B3:F1:A7:45:E2:F0:FF:61:FA:71
Signature algorithm name: SHA1withRSA
Version: 3

>JCP формат jks не поддерживает.

а в чём проявляется или может проявиться не поддержка? (в ключах, хранилищах, сертификатах плохо соображаю, но поставлена задача, нужно решить и как всегда в кратчайшие сроки, особо изучать некогда :( )
Может это влиять на возникновение ошибки cast?
Или на cast влияет только алгоритм ключа?

Я для работы с хранилищем делаю вот что:

KeyStore keyStore = KeyStore.getInstance("JKS", "SUN");
keyStore.load(new FileInputStream("I:\\certs.jks"), "password".toCharArray());


PrivateKey privateKey = (PrivateKey)keyStore.getKey(ALIAS, PASS);
X509Certificate cert = (X509Certificate)keyStore.getCertificate(ALIAS);
ALIAS и PASS это уже для ключа указано...


xmlsec точно подключена 1.5.3.
Offline Евгений Афанасьев  
#5 Оставлено : 20 декабря 2012 г. 13:41:34(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
В блоге в статье, например, алгоритм указывается так:
Код:

Reference ref = fac.newReference("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null),

т.е. предполагается ключ на алгоритме ГОСТ (можете сделать себе тестовый в Тестовом УЦ - http://cryptopro.ru/certsrv или найти пример создания ключа и сертификата в samples.jar, что проще), а у вас RSA. В таком случае, "http://www.w3.org/2001/04/xmldsig-more#gostr3411" следует заменить на более подходящий (например, "http://www.w3.org/2001/04/xmldsig-more#sha384"), с алгоритмом подписи то же самое.

Не нашел в архиве с примерами работы с wss4j указаний использовать именно xmlsec-1.5.3.jar, скорее xmlsec-1.5.0 (попробуйте его, см. ридми).
Остальные библиотеки подключены?

Отредактировано модератором 20 декабря 2012 г. 13:44:07(UTC)  | Причина: Не указана

Offline bankir1980  
#6 Оставлено : 20 декабря 2012 г. 14:42:14(UTC)
bankir1980

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

Группы: Участники
Зарегистрирован: 20.12.2012(UTC)
Сообщений: 29
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
>а у вас RSA. В таком случае, "http://www.w3.org/2001/04/xmldsig-more#gostr3411" следует заменить на более подходящий (например, "http://www.w3.org/2001/04/xmldsig-more#sha384"),
ага, я это уже пробовал. Весь код из блога(подпиленный немного) работал без установки JCP вообще с RSA алгоритмом.

Но мне же для СМЭВ надо именно ГОСТ. Вот и бьюсь теперь :)

Первоначально использовал xmlsec-1.5.0.jar, т.к. где то видел требование именно к версии 1.5. Но к чему требование уже не помню.
Дело в том, что сами XML данные генерит код с помощью axis2 (client), сгенерированный с помощью wdsl2java на базе xmlbeans. Может там требование было...
Увидел 1.5.3 в пакете wss4j попробовал и с ним. Всё равно не пашет.

Остальные библиотеки - это какие именно?

Offline Евгений Афанасьев  
#7 Оставлено : 20 декабря 2012 г. 14:52:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Автор: afev Перейти к цитате
см. ридми


axis-1.4.jar
axis-jaxrpc-1.4.jar
bcmail-jdk16-146.jar
bcprov-jdk15-1.46.jar
commons-discovery-0.2.jar
commons-logging-1.1.1.jar
joda-time-1.6.2.jar
junit-4.8.2.jar
log4j-1.2.16.jar
opensaml-2.5.1-1.jar
openws-1.4.2-1.jar
serializer-2.7.1.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
wss4j-1.6.3.jar
xalan-2.7.1.jar
xmlsec-1.5.0.jar
xmltooling-1.3.2-1.jar

Для ГОСТ вам нужен контейнер с ключом на ГОСТ-алгоритме и сертификат, а не RSA.

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

Offline bankir1980  
#8 Оставлено : 20 декабря 2012 г. 15:27:05(UTC)
bankir1980

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

Группы: Участники
Зарегистрирован: 20.12.2012(UTC)
Сообщений: 29
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
в xmlsec-1.5.0.jar точно нет процедуры init в классе KeyInfo

org.apache.xml.security.keys.KeyInfo.init()

такую процедуру я нашел в xmlsec-1.4.5.jar

с xmlsec-1.5.0 выдает ошибку

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.xml.security.keys.KeyInfo.init()V
at ru.CryptoPro.JCPxml.XmlInit.register(Unknown Source)
at ru.CryptoPro.JCPxml.XmlInit.init(Unknown Source)
at ru.CryptoPro.JCPxml.XmlInit.init(Unknown Source)
at ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit.init(Unknown Source)
at test.smev.main.main(main.java:257)
Offline bankir1980  
#9 Оставлено : 20 декабря 2012 г. 15:43:11(UTC)
bankir1980

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

Группы: Участники
Зарегистрирован: 20.12.2012(UTC)
Сообщений: 29
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Кстати, ключ на сайте сгенерировал, контейнер на основе реестра создал. Пароль к закрытому ключу задал. В контейнере показывает сертификат, который удостоверен вышестоящим сертификатом тестового УЦ

Что мне нужно прописывать в коде в ALIAS вот в этих строках?
PrivateKey privateKey = (PrivateKey)keyStore.getKey(ALIAS, PASSWORD);
X509Certificate cert = (X509Certificate)keyStore.getCertificate(ALIAS);

PS. Подключил xmlsec-1.4.5.xml, поставил в Top в classpath, ошибка на org.apache.xml.security.keys.KeyInfo.init() не вылезает.
Теперь выдает на

PrivateKey privateKey = (PrivateKey)keyStore.getKey(ALIAS, PASS);

Exception in thread "main" java.security.KeyStoreException: Uninitialized keystore
at java.security.KeyStore.getKey(Unknown Source)
at test.smev.main.main(main.java:301)

подозреваю, что ALIAS и PASS некорректно заданы. В алиал задаю название контейнера.
Offline Евгений Афанасьев  
#10 Оставлено : 20 декабря 2012 г. 16:02:19(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Алиас можете посмотреть, запустил панель
ControlPane <JRE>
где <JRE> - путь к jre, где установлен jcp.

Перед получением ключа getKey() выполнили keyStore.load(null, null) ?

KeyInfo.init() используется в JCPxml, он использует xmlsec-1.4.x

Отредактировано пользователем 20 декабря 2012 г. 16:03:22(UTC)  | Причина: Не указана

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