Статус: Новичок
Группы: Участники
Зарегистрирован: 28.08.2013(UTC) Сообщений: 6 Сказал(а) «Спасибо»: 1 раз
|
Доброго времени суток. Столкнулись с проблемой валидации полученной подписи на сервисе Минкомсвязи http://195.245.214.33:7777/esv/SignatureTool.asmx?wsdl (документация на http://smev.gosuslugi.ru сервис SID0003318). Валидацию даже не проходит сгенерированная подпись из примера "Создание и проверка подписи документа XML по шаблону" документации. Выдает ошибку - "Входные данные не являются подписанным сообщением". После ряда экспериментов было выявлено, что проблема похоже в xml:id, т.е. если указывать просто id (без намспэйса xml) возвращается уже ошибка "Электронная подпись недействительна" (что логично из-за удаления префикса xml:). С другой стороны, при попытке подписать тэг с аттрибутом id (без намспэйса xml) приводит к ошибке при подписи: An error was encountered while processing an XML digital signature. (0x800705BA)При этом, если использовать вариант без ссылки на подписываемый элемент ( <Reference URI="">) - то все подписывается и валидируется на данном сервисе. Есть ли выход из данной ситуации?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 28.08.2013(UTC) Сообщений: 6 Сказал(а) «Спасибо»: 1 раз
|
Проверяем методом VerifyXMLSignature сервиса Минкомсвязи. Namespace xml для аттрибута id подписываемого элемента устанавливаем как в примере "Создание и проверка подписи документа XML по шаблону" документации по КриптоПро ЭЦП Browser plugin. Если namespace не указать, то при подписи происходит ошибка - An error was encountered while processing an XML digital signature. (0x800705BA)
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Здравствуйте! Можете выложить документ?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 28.08.2013(UTC) Сообщений: 6 Сказал(а) «Спасибо»: 1 раз
|
Здравствуйте, Елена. В документации по метод рекомендациям СМЭВ версии 2.5.6 написано: Значение подписи должно рассчитываться для содержимого элемента smev:AppData и его составных элементов. При этом для привязки подписи к элементу smev:AppData используется атрибут Id. <smev:AppData Id="AppData">...</smev:AppData> Соответственно формируем такой шаблон для подписи и пытаемся его подписать: Код:
//... Создание oSignedXML
var sContent = '<smev:AppData xmlns:smev="http://smev.gosuslugi.ru/rev120315" Id="AppData"><testA>A</testA><testB>B</testB><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/><Reference URI="#AppData"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/><DigestValue></DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo><X509Data><X509Certificate></X509Certificate></X509Data></KeyInfo></Signature></smev:AppData>';
var sSignedMessage = "";
try {
oSignedXML.SignatureType = CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE;
oSignedXML.Content = sContent;
sSignedMessage = oSignedXML.Sign(signContext.oSigner);
} catch (err) {
alert("Failed to create signature. Error: " + GetErrorMessage(err));
return;
}
Получаем ошибку: An error was encountered while processing an XML digital signature. (0x800705BA) Если вместо аттрибута Id указываем xml:id, то подпись проходит успешно: Код:
//... Создание oSignedXML
var sContent = '<smev:AppData xmlns:smev="http://smev.gosuslugi.ru/rev120315" xml:id="AppData"><testA>A</testA><testB>B</testB><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/><Reference URI="#AppData"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/><DigestValue></DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo><X509Data><X509Certificate></X509Certificate></X509Data></KeyInfo></Signature></smev:AppData>';
var sSignedMessage = "";
try {
oSignedXML.SignatureType = CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE;
oSignedXML.Content = sContent;
sSignedMessage = oSignedXML.Sign(signContext.oSigner);
} catch (err) {
alert("Failed to create signature. Error: " + GetErrorMessage(err));
return;
}
Получаем такой подписанный документ: Код:
<smev:AppData xmlns:smev="http://smev.gosuslugi.ru/rev120315" xml:id="AppData"><testA>A</testA><testB>B</testB><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/><Reference URI="#AppData"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/><DigestValue>ALV4HdPCUpzciIaPRi3pn46zz2ARIG1wjlrS1wWYkso=</DigestValue></Reference></SignedInfo><SignatureValue>M4MUtOrGkX0h4XA9/rTnDREz8VdkCN0x4ztFH+xouenVz/HbS6yZD4nrCSA77HmT
zt4HDgP0KdOJzo3JYq6VRA==</SignatureValue><KeyInfo><X509Data>
<X509Certificate>MIIDODCCAuegAwIBAgIKbF1PdwACAASa9jAIBgYqhQMCAgMwZTEgMB4GCSqGSIb3
DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpD
UllQVE8tUFJPMR8wHQYDVQQDExZUZXN0IENlbnRlciBDUllQVE8tUFJPMB4XDTEz
MDcxMTA4NDE0NloXDTE0MTAwNDA3MDk0MVowdzEdMBsGCSqGSIb3DQEJARYOdGVz
dG92QHRlc3Quc3UxDzANBgNVBAMMBlRlc3RvdjEMMAoGA1UECwwDRGV2MQwwCgYD
VQQKDANLQ0sxDjAMBgNVBAcMBVBlbnphMQwwCgYDVQQIDANQTloxCzAJBgNVBAYT
AlJVMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQBJFqTF0M3cV
GSly5M9A6/5OobSMDsmSqLNwodfdKdmdu0wA84HMmrqPzC4qxq9SSq8tmnvvE96t
5bOQ2fCf6cSjggFjMIIBXzAOBgNVHQ8BAf8EBAMCBPAwEwYDVR0lBAwwCgYIKwYB
BQUHAwIwHQYDVR0OBBYEFAjX+bzAZTmIM+zSd76pk3vkSp2CMB8GA1UdIwQYMBaA
FG2PXgXZX6yRF5QelZoFMDg3ehAqMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93
d3cuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvVGVzdCUyMENlbnRlciUyMENSWVBU
Ty1QUk8oMikuY3JsMIGgBggrBgEFBQcBAQSBkzCBkDAzBggrBgEFBQcwAYYnaHR0
cDovL3d3dy5jcnlwdG9wcm8ucnUvb2NzcG5jL29jc3Auc3JmMFkGCCsGAQUFBzAC
hk1odHRwOi8vd3d3LmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3BraS1zaXRlX1Rl
c3QlMjBDZW50ZXIlMjBDUllQVE8tUFJPKDIpLmNydDAIBgYqhQMCAgMDQQB+vev8
KCxhq1fqxzV3drVnrPIzcVxodVMLi37WpjrTKgRGGk3kbOiB4LOsuaKNfVnfE2Ye
Z2mt/E3QFkouxd1m</X509Certificate>
</X509Data></KeyInfo></Signature></smev:AppData>
Но он не проходит валидацию на сервисе Минкомсвязи http://195.245.214.33:7777/esv/SignatureTool.asmx?wsdl (документация на http://smev.gosuslugi.ru сервис SID0003318) методом VerifyXMLSignature. Результат: Код:<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<VerifyXMLSignatureResponse xmlns="http://esv.server.rt.ru">
<VerifyXMLSignatureResult>
<Code>2</Code>
<Description>Входные данные не являются подписанным сообщением</Description>
</VerifyXMLSignatureResult>
</VerifyXMLSignatureResponse>
</soap:Body>
</soap:Envelope>
Т.е. получается, что плагин не может подписать элемент с аттрибутом Id( только с xml:id), а в свою очередь сервис проверки не может проверить документ с аттрибутом xml:id . Получается патовая ситуация. Пытаемся уже сформировать подпись вручную (с расчетом хэша и отдельно подписи), но столкнулись с другой проблемой метод oRawSignature.SignHash требует на вход oCertificate, а не oSigner. А нам нужно подписать сразу несколько документов, и чтобы пароль не вводить каждый раз по вашему совету использовали OSigner.KeyPin . А тут получается нужно будет каждый раз вводить пароль. Очень надеемся на Вашу помощь.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 28.08.2013(UTC) Сообщений: 6 Сказал(а) «Спасибо»: 1 раз
|
В предыдущем посте Вы описали подпись ИС(информационной системы), которая как Вы правильно заметили соответствует стандарту OASIS Standard 200401. Она накладывается на весь soap Body. Но в СМЭВ еще используются подписи физических лиц, которыми подписываются вложения(в бинарном формате) и xml-блок AppData (в формате xmldsig). Выдержка из документации по метод рекомендациям СМЭВ версии 2.5.6 о подписи физических лиц: Значение подписи должно рассчитываться для содержимого элемента smev:AppData и его составных элементов. При этом для привязки подписи к элементу smev:AppData используется атрибут Id. <smev:AppData Id="AppData">...</smev:AppData>
Подпись ИС ставится на сервере, а вот подпись физического лица - на клиенте. Но как уже было описано выше - сделать это в нужном для СМЭВ виде плагин не может: При подписи с привязкой к элементу <smev:AppData Id="AppData"> (в Reference указываем URI="#AppData") происходит ошибка - An error was encountered while processing an XML digital signature. (0x800705BA).
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Здравствуйте! Проблему воспроизвели, будем смотреть, что можно сделать.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
С атрибутами id непростая ситуация. В спецификации явно не написано, должен ли атрибут называться "Id" или "id". Поэтому следует явно указать, какой именно атрибут Id вы будете использовать. Это можно сделать через DTD: Код:<!ATTLIST someElement Id ID #IMPLIED>
В вашем случае в начало документа нужно добавить что-то такое: Код:<!DOCTYPE test [<!ATTLIST smev:AppData Id ID #IMPLIED>]>
Либо можно использовать атрибут xml:id, см. http://www.w3.org/TR/xml-id/
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close