logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий19891  
#1 Оставлено : 18 января 2018 г. 15:16:24(UTC)
Дмитрий19891

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

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

Здравствуйте!

Пытаюсь получить ответ из ФСС Сервис Страхователя с подписанием и шифрованием данных (версия 1.1)
подписываю запрос или подсовываю из примера (руководства), шифрую вкладываю в бади нового
соап конверта и от ФСС всегда получаю ответ

(com.sun.xml.internal.ws.fault.ServerSOAPFaultException) com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: ru.ibs.cryptoprto.jcp.wrapper.ws.client.generated.CryptoException_Exception: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. class org.w3c.dom.DOMException Please see the server log to find more detail regarding exact cause of the failure.

Использую JCP
Откликнитесь, пожалуйста, кто имел опыт общения с этим сервисом.
Offline Дмитрий19891  
#2 Оставлено : 24 января 2018 г. 14:15:16(UTC)
Дмитрий19891

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

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

Разобрался. Я неправильно подписывал сообщение. Теперь другой вопрос, может кто знает
Тестовый Сервис ФСС ответил мне шифрованным сообщением. Я посылал запрос
getPrivateLNData("3103275205", "290195190104", "09365295200") (взял эти регнам,ЭЛН,СНИЛС из примера)
Но расшифровать его я не могу

XMLCipher xmlCipher = XMLCipher.getInstance();
xmlCipher.init(XMLCipher.DECRYPT_MODE, null);
Element encryptedDataElement = (Element) doc2.getElementsByTagNameNS(EncryptionConstants.EncryptionSpecNS,EncryptionConstants._TAG_ENCRYPTEDDATA).item(0);
xmlCipher.setKEK(key);
xmlCipher.doFinal(doc2, encryptedDataElement);

Получаю Exception "No Key Encryption Key loaded and cannot determine using key resolvers"

Это ошибка что неправильный ключ для расшифровки (не тот абонент) или в принципе неправильный объект ключ и он его не загрузил?

Кто знает где для тестового ФСС взять ключ чтобы расшифровать ответ на 3103275205?
Может это офтоп, а может, и нет и я что-то неправильно делаю, но ФСС и КриптоПро нераздельны.
Offline Евгений Афанасьев  
#3 Оставлено : 25 января 2018 г. 11:08:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 294 раз в 291 постах
Здравствуйте.
Прикрепите полученный документ, посмотрим.
Техническую поддержку оказываем тут
Наша база знаний
Offline Дмитрий19891  
#4 Оставлено : 25 января 2018 г. 13:25:10(UTC)
Дмитрий19891

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

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

lastin.xml (19kb) загружен 29 раз(а).
Offline Дмитрий19891  
#5 Оставлено : 29 января 2018 г. 14:42:06(UTC)
Дмитрий19891

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

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

Еще вопрос, можно ли как-нибудь устанавливать Java CSP без установки JCP? или сделать какой-то
очень лайт патч клиентского JRE? Потому что если использовать чисто jar библиотеки из
дистрибутива java-csp-5.0.39267 на Java, по которой не проехалась JCP,
проблемы начинаются сразу, типа:
(java.security.KeyStoreException) java.security.KeyStoreException: HDImageStore not found
(java.security.NoSuchAlgorithmException) java.security.NoSuchAlgorithmException: GOST28147 KeyGenerator not available

Просто не представляю как клиенту в инсталлятор запихать установку JCP
Вроде в дот нет версии вы не патчите дотнет, может есть какие-то варианты?

Offline Евгений Афанасьев  
#6 Оставлено : 30 января 2018 г. 10:01:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 294 раз в 291 постах
В обозримом будущем сделаем версию jcp без установки (копирования) в lib/ext, но пока требуется установка.
Техническую поддержку оказываем тут
Наша база знаний
Offline mihmig  
#7 Оставлено : 21 февраля 2018 г. 5:46:28(UTC)
mihmig

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

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

Дмитрий19891
Получилось ли у Вас настроить взаимодействие с ФСС?

afev
А какой формат имеет подпись в данном XML-файле - cades_bes или что-то иное?
Offline Дмитрий19891  
#8 Оставлено : 21 февраля 2018 г. 7:02:27(UTC)
Дмитрий19891

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

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

Формат подписи описан на страницах сайта ФСС о ЭЛН (cabinets-test.fss.ru eln)

Взаимодействие с ФСС наладить удалось
Offline Евгений Афанасьев  
#9 Оставлено : 21 февраля 2018 г. 8:28:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 294 раз в 291 постах
Здравствуйте.
Автор: mihmig Перейти к цитате
afev
А какой формат имеет подпись в данном XML-файле - cades_bes или что-то иное?

На счет формата не в курсе, т.к. был предоставлен XML с зашифрованным (неподписанным) сообщением.

Техническую поддержку оказываем тут
Наша база знаний
Offline Ivan G. Zakirov  
#10 Оставлено : 14 марта 2018 г. 9:50:34(UTC)
Ivan G. Zakirov

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

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

Автор: Дмитрий19891 Перейти к цитате
Разобрался. Я неправильно подписывал сообщение. Теперь другой вопрос, может кто знает
Тестовый Сервис ФСС ответил мне шифрованным сообщением. Я посылал запрос
getPrivateLNData("3103275205", "290195190104", "09365295200") (взял эти регнам,ЭЛН,СНИЛС из примера)
Но расшифровать его я не могу

XMLCipher xmlCipher = XMLCipher.getInstance();
xmlCipher.init(XMLCipher.DECRYPT_MODE, null);
Element encryptedDataElement = (Element) doc2.getElementsByTagNameNS(EncryptionConstants.EncryptionSpecNS,EncryptionConstants._TAG_ENCRYPTEDDATA).item(0);
xmlCipher.setKEK(key);
xmlCipher.doFinal(doc2, encryptedDataElement);

Получаю Exception "No Key Encryption Key loaded and cannot determine using key resolvers"

Это ошибка что неправильный ключ для расшифровки (не тот абонент) или в принципе неправильный объект ключ и он его не загрузил?

Кто знает где для тестового ФСС взять ключ чтобы расшифровать ответ на 3103275205?
Может это офтоп, а может, и нет и я что-то неправильно делаю, но ФСС и КриптоПро нераздельны.


Как решили проблему с ключем для дешифровки?
Offline Евгений Афанасьев  
#11 Оставлено : 14 марта 2018 г. 10:10:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 294 раз в 291 постах
Судя по переписке в ЛС, решить проблему удалось (ответить может только сам автор поста).
Предположу, что вы используете ключ подписи (PrivateKey) для операции расшифрования, а не ключ обмена (ExchangeKey). Т.к. применяется согласование ключей и алгоритм GostTransport, то при вызове init() у Cipher проверяется, что ключ, который подали в setKEK(key) - ключ обмена. Эта ошибка, правда, поглощается внутри xmlsec, ее не увидать без включения логирования, например, так: -Djava.util.logging.config.file=log.properties
где log.properties содержит:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
handlers=java.util.logging.ConsoleHandler
.level=ALL
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Тогда в логе может появиться строка вида: Original Exception was java.security.InvalidKeyException: Ключ подписи нельзя использоваться для этой операции.
Далее я использовал ключ обмена, но расшифровать, естественно, не удалось: получил ту же ошибку, т.к. нужен правильный ключ.
Также нужно сказать, что часто в коде xmlsec используется XMLCipher cipher = XMLCipher.getInstance(), т.е. без указания провайдера (его никак не передать извне). Поэтому можно вернуться к первому варианту, как в примере CryptXML из samples.jar, и использовать XMLCipher xmlCipher = XMLCipher.getInstance(), но при этом JCSP должен быть в списке java.security выше JCP, т.к. в таком случае провайдер для XMLCipher определяется по положению в списке.

Алгоритму urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001 соответствует шифратор TransportCipher. TransportCipher вызывается самим xmlsec. Но TransportCipher принимает для расшифрования только ключа обмена (не ключ подписи). Пример зашифрования есть в CryptXML в samples.jar:
SecretKey sessionKey =
X509Certificate cert =
XMLCipher keyCipher = XMLCipher.getInstance(Consts.URI_GOST_TRANSPORT);
keyCipher.init(XMLCipher.WRAP_MODE, cert.getPublicKey()); // создается эфемерный ключ E, согласуется с открытым ключом получателя O, получаем ключ согласования A, на котором в дальнейшем будет зашифрован sessionKey. Эта структура KeyTransport потом будут помещена в EncryptedKey
EncryptedKey encryptedKey = keyCipher.encryptKey(doc, sessionKey);
encryptedKey.setKeyInfo(certKeyInfo);
Далее, согласно примеру, на сессионном ключе sessionKey выполняется шифрование данных, и данные помещаются в CipherValue.

Можно и обратно извлечь все узлы и выполнить работу, которую делает xmlsec, примерно так:
XMLCipher keyCipher = XMLCipher.getInstance(Consts.URI_GOST_TRANSPORT);
keyCipher.init(XMLCipher.UNWRAP_MODE, <private_key>); // будет снова выполнено согласование эфемерного ключа E из EncryptedKey с закрытым ключом P, на полученном ключе согласования A будет расшифрован сессионный ключ sessionKey. Только ключ обмена в private_key в init!
SecretKey sessionKey = keyCipher.decryptKey(<EncryptedKey>);
...
XMLCipher xmlCipher = XMLCipher.getInstance();
xmlCipher.init(XMLCipher.DECRYPT_MODE, null);
Element encryptedDataElement = (Element) doc.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTEDDATA).item(0);
if (key != null) xmlCipher.setKEK(sessionKey);
xmlCipher.doFinal(doc, encryptedDataElement); // расшифрование CipherValue на ключе sessionKey
Более точная реализация есть прямо в xmlsec.
Техническую поддержку оказываем тут
Наша база знаний
Offline Ivan G. Zakirov  
#12 Оставлено : 14 марта 2018 г. 10:31:24(UTC)
Ivan G. Zakirov

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

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

Автор: afev Перейти к цитате
Можно и обратно извлечь все узлы и выполнить работу


Работаю с C#. Пример шифрования и дешифровки брал из Crypto Pro .NET SDK "EncryptCerts.cs".
В методе:
Цитата:
// Получение ключа расшифрования
private static SymmetricAlgorithm GetDecryptionKey(EncryptedXml exml,
EncryptedData encryptedData)

Получение ключа дешифровки происходит из PrivateKey сертификата находящегося в локальном хранилище ПК.

Т.е. я правильно понимаю принцип работы с ФСС: мы шифруем сообщение их публичным сертификатом (они наш запрос принимают и расшифровывают удачно т.к. ответ от них приходит), ответ должен прити зашифрованным нашим публичным сертификатом (ну или его публичной частью) а мы из хранящейся у нас приватной части сертификата получаем ключ дешифровки и расшифровываем. Примерно так ?

PS: или в случае с ФСС надо как-то иначе добывать ключ дешифровки путем танцев с бубном из данных их публичного сертификата (как вы описали выше) которым они шифруют ? (на тек. момент с тестового сервиса приходит шифрованное сообщение их же публичным сертификатом от которого приватного ключа у нас быть не может естественно. Возможно это потому-что используем данные из тестового примера и шифрование происходит по сертификату прикрепленному по регистрационному номеру страхователя).
Offline PaulIsh  
#13 Оставлено : 4 апреля 2018 г. 4:28:19(UTC)
PaulIsh

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

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

Добрый день.

Пытаемся повторить весь процесс на web используя http://gostcrypto.com/

Также столкнулись с неясностью алгоритма.
Как мы видим процесс:

1. Формируем UKM (случайные 8 байт)
2. Формируем KEK (ключ шифрования ключа) используя публичный ключ ФСС, наш закрытый ключ и UKM алгоритмом VKO GOST R 34.10-2001
3. Формируем CEK (ключ шифрования содержимого) для GOST 28147
4. Шифруем данные по GOST 28147
5. Шифруем ключ CEK используя KEK и UKM по GOST 28147-89 key wrap

Далее для XML сцепляем UKM и данные и переводим в base64, также в base64 переводим зашифрованный ключ.

ФСС нам выдает ошибку. Что мы делаем не так?
Offline Ivan G. Zakirov  
#14 Оставлено : 4 апреля 2018 г. 6:02:00(UTC)
Ivan G. Zakirov

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

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

Автор: PaulIsh Перейти к цитате
Добрый день.

Пытаемся повторить весь процесс на web используя http://gostcrypto.com/

Также столкнулись с неясностью алгоритма.
Как мы видим процесс:

1. Формируем UKM (случайные 8 байт)
2. Формируем KEK (ключ шифрования ключа) используя публичный ключ ФСС, наш закрытый ключ и UKM алгоритмом VKO GOST R 34.10-2001
3. Формируем CEK (ключ шифрования содержимого) для GOST 28147
4. Шифруем данные по GOST 28147
5. Шифруем ключ CEK используя KEK и UKM по GOST 28147-89 key wrap

Далее для XML сцепляем UKM и данные и переводим в base64, также в base64 переводим зашифрованный ключ.

ФСС нам выдает ошибку. Что мы делаем не так?


Да проблему решил и алгоритм работает на тестовом контуре в двух вариантах с шифрованием и без.
Основные проблемы возникавшие - это отступление от шаблона (XML документа) указанного в спецификации (упущено явное указание простраства имен тэгов, изменен порядок следования узлов, упущена замена стандартной информации сформированной на требуемую по спецификации). Могу лишь описать как на C# выполнялось, основа подхода работы бралась из примера "C:\Program Files\Crypto Pro\.NET SDK\Examples\simple.zip\Xml\cs\EncryptCerts.cs":
1. Создаем XML документ соответствующий структуре по спецификации п.4.4.
2. Накладываем ЭЦП на содержимое узла "<soapenv:Body wsu:Id="REGNO_#########">. Пришлось использовать измененный SignedXml по причине наличия требования в спецификации явных пространств имен, пример есть на "http://cryptopro.ru/blog/2012/05/16/podpis-soobshchenii-soap-dlya-smev-s-ispolzovaniem-kriptopro-net", а стандартный SignedXml не умеет подписывать с пространством имен, что приводило либо к ошибкам, либо не соответствие подписи и содержимого.
2.1. Результат работы ЭЦП -> содрежимое узлов "wsse:BinarySecurityToken", "SignatureValue", "SignedInfo" и в общем всего что необходимо по спецификации -> добавляем в документ из (п.1). Это необходимо по причине того (возможно только в C#), что созданный XML блок в результате подписи не соответствует требуемой по спецификации ФСС структуре XML.
3. Шифрование.
3.1. Создаем документ XML соответствующий структуре по спецификации (п.5.1..) Обратим внимание что в спецификации есть "косяк" с тэгами узлов "<soapenv:Body>" и "</SOAP-ENV:Body>". Мы использовали соответствие общей структруе "<soapenv:Body>" а зашифрованная структура "</xenc:EncryptedData>" содержалась внутри "<soapenv:Body>".
3.2. Конечный документ из (п.2.) шифруем.
3.2.1. Получаем (X509Certificate2) публичную часть сертификата получателя (ФСС тестовый контур) из хранилища на локальном ПК.
3.2.2. Используя шифровщик XML "EncryptedXml" создаем блок зашифрованных данных "EncryptedData" (EncryptedData EncryptedData = EncryptedXml.Encrypt(XmlElement, CertificateEncrypt);). В качестве XmlElement указывался "<soapenv:Body>" из конечного документа из (п.2.).
3.2.3. Для EncryptedData указываем свойства: Type = "CryptoAlgoritm.GOST28147_89" (берется из библиотеки CryptoPro), EncryptionMethod = new EncryptionMethod(CPEncryptedXml.XmlEncGost28147Url)
3.2.4. Получаем результирующий XML зашифрованных данных из EncryptedData (XmlElement EncryptedElement = EncryptedData.GetXml();).
3.3. Опять из-за разницы требований спецификации и результатов полученных шифрованием, данные из (п.3.2.4.) подставляем в соответствующие тэги созданные в документе в (п.3.1.) и получаем итоговый зашифрованный документ готовый к отправке (пример XSLT шаблона для трансформации на C#):

4. По требованию спецификации необходимо в отправляемом сообщении указать свой публичный сертификат, поэтому заменяем информацию сертификата в узле "/soapenv:Envelope/soapenv:Body/xenc:EncryptedData/ds:KeyInfo/xenc:EncryptedKey/ds:KeyInfo/ds:X509Data/ds:X509Certificate" на свой сертификат (им будет шифроваться ответ от сервера), остальную часть "xenc:EncryptedData" не трогаем.

PS (касаемо C#): никаких самостоятельных формирований ключа и т.п. не производили(все необходимые ключи есть в сертификате), все выполнялось стандартными средствами криптографии и подключенными библиотеками CryptoPro:
using CryptoPro.Sharpei;
using CryptoPro.Sharpei.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;

Отредактировано пользователем 4 апреля 2018 г. 6:27:23(UTC)  | Причина: Выделение основных проблем.

Offline arte-tkolomiets  
#15 Оставлено : 15 июня 2018 г. 12:04:16(UTC)
arte-tkolomiets

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

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

Приветствую, коллеги.
Не можете дать мне актуальное на данный момент шифрованное сообщение в ФСС на которое оно выдает ответ? В Xml-формате, конечно.
https://docs-test.fss.ru/WSLnCryptoV11 - для этого сервиса? Чобы я мог его исследовать немного на предмет внутренее кухни ФСС.
Дело в том, что мне нужно использовать низкоуровневое API на данный момент, да еще на делфи. Не могу пока преодолеть момент. Нужно понять, каие структуры шифрования, алгортмы, ФСС принимает на вход.
Первичный код вроде написан по мотивам темы
https://www.cryptopro.ru...osts&t=13688&p=2
но пока результат нулевой - отбрасывает просто все.

Отредактировано пользователем 15 июня 2018 г. 12:06:13(UTC)  | Причина: Не указана

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