Статус: Участник
Группы: Участники
Зарегистрирован: 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-й класс и так далее.
Просто замкнутый круг какой то.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 хранилище сертификатик один для работы с Юнистрим. Пока сертификата для полноценного тестирования СМЭВ нет. Может с этим связано возникновение первой ошибки?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 попробовал и с ним. Всё равно не пашет.
Остальные библиотеки - это какие именно?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 некорректно заданы. В алиал задаю название контейнера.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close