Ошибка подписи xml subrc 1 sign


Offline

Vladimir2008

 


#1
Оставлено
:

6 мая 2016 г. 17:14:47(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Установлены Windows 10 (64-битная), КриптоПро CSP 3.9.8423, КриптоПро .Net 1.0.5913.0.
Создаю подпись в XML-документе через примеры в C:Program Files (x86)Crypto Pro.NET SDKExamples4.0, запускаю в командной строке:

Цитата:

SimpleCS.exe Xml.SignDocument mycert

Создается и проверяется успешно.
До тех пор, пока не установлю некие обновления Windows, а именно (перечисляю под все версии Windows, на которых срабатывает также):
— На Windows 7 обновления KB3135983 и KB3136000
— На Windows 8 — KB3135985 и KB3135998 (возможно, еще — KB3135994)
— На Windows 10 — KB3140768 и KB3147458
— также обновление KB3135996
Если эти обновления установлены, то подпись формируется, но не проверяется — signedXml.CheckSignature() всегда выдает false (на этом месте рушится в моем программе). Если говорить о примере, указанном выше, сообщение такое:

Цитата:

Создан новый XML файл.
XML подписан.
Подпись не верна.

Как только обновления деинсталлированы — опять все работает.
От версии .Net Framework — не зависит — проблема и на 2.0 и 4.0.
Просьба прокомментировать, как с этим бороться, поскольку обновления приходится сносить не с одного рабочего места (их (мест) относительно много).

В случае, когда успешно (обновления не установлены):
doc_to_sign.xml (1kb) загружен 4 раз(а).
doc_signed.xml (4kb) загружен 9 раз(а).

Эти файлы — когда обновления установлены (не проверяется подпись):
doc_to_sign.xml (1kb) загружен 3 раз(а).
doc_signed.xml (4kb) загружен 7 раз(а).


Вверх

Offline

Максим Коллегин

 


#2
Оставлено
:

6 мая 2016 г. 18:40:37(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

А если подпись сделать до обновления, а проверять после установки?
И файлы вы приложили идентичные.
Попробуйте убрать smev трансформ из подписи, может с ним проблема.

Отредактировано пользователем 6 мая 2016 г. 18:41:55(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Vladimir2008

 


#3
Оставлено
:

10 мая 2016 г. 10:12:56(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Да, проблема в указанном примере была именно в smev-трансформе, если его убрать, то работает, точнее работает преобразование:

Цитата:

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);

Проблема возникает, когда хочется подписать несколькими ЭП, причем не сразу всеми, когда известно их кол-во. Если кол-во известно, то две строки кода

Цитата:

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);

нужно прописать столько раз, сколько подписей (во всяком случае — так работает). Но если заранее неизвестно их кол-во, то писать эти две строки «с запасом» — неправильно.
Проблему решал другой трансформ:

Цитата:

XmlDsigXPathTransform xpath = CreateXPathTransform();
reference.AddTransform(xpath);

где

Цитата:

private static XmlDsigXPathTransform CreateXPathTransform()
{
XmlDocument doc = new XmlDocument();

doc.LoadXml(«<XPath xmlns:dsig=»http://www.w3.org/2000/09/xmldsig#»>»
+ «not(ancestor-or-self::dsig:Signature)</XPath>»);
XmlElement xPathElem = (XmlElement)doc.SelectSingleNode(«/XPath»);

XmlDsigXPathTransform xForm = new XmlDsigXPathTransform();

xForm.LoadInnerXml(xPathElem.SelectNodes(«.»));

return xForm;
}

Но с учетом указанных выше обновлений — это не работает. Подпись создается корректной, но валидацию на компе с такими обновлениями Windows не проходит. Т.е., получается КриптоПро .Net работает не 100%-но (в разных версиях Windows)?

Отредактировано пользователем 10 мая 2016 г. 11:02:45(UTC)
 | Причина: Не указана


Вверх

Offline

Максим Коллегин

 


#4
Оставлено
:

10 мая 2016 г. 13:10:06(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Возможно в трансформе есть неточность — посмотрим.

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Максим Коллегин

 


#5
Оставлено
:

11 мая 2016 г. 10:32:03(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Очень интересное вскрылось.
MS ввели понятие safe transform. Увидел, рассматривая код рефлектором.
Ошибку можно отследить, включив лог SignedXml, как написано тут:
https://social.msdn.micr…buglog?forum=xmlandnetfx

Цитата:

System.Security.Cryptography.Xml.SignedXml Information: 17 : [SignedXml#01475d71, UnsafeTransformMethod] Canonicalization method «urn://smev-gov-ru/xmldsig/transform» is not on the safe list. Safe canonicalization methods are: «http://www.w3.org/TR/2001/REC-xml-c14n-20010315», «http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments»,

Лечится добавлением кода в проверку:

Код:

signedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");

Отредактировано пользователем 11 мая 2016 г. 10:38:21(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW

thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.

vadimromanov

оставлено 13.12.2016(UTC)


Offline

Vladimir2008

 


#6
Оставлено
:

11 мая 2016 г. 11:50:11(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

SafeCanonicalizationMethods — где взять аналог для Framework 4.0?
И как быть с преобразованием XmlDsigXPathTransform (не smev)?

Отредактировано пользователем 11 мая 2016 г. 11:56:22(UTC)
 | Причина: Не указана


Вверх

Offline

Максим Коллегин

 


#7
Оставлено
:

11 мая 2016 г. 13:25:05(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Код, судя по всему, в зависимости от версии Framework ветвиться не умеет — собирайте отдельно для 4.5.1 и для более ранних.
Для XmlDsigXPathTransform — добавьте в SafeCanonicalizationMethods XmlDsigXPathTransform.Algorithm

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Vladimir2008

 


#8
Оставлено
:

11 мая 2016 г. 13:36:03(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Вопрос в том и состоит — как сделать аналог SafeCanonicalizationMethods (появился только в FW 4.5.1) для FW 4.0 ?


Вверх

Offline

Максим Коллегин

 


#9
Оставлено
:

11 мая 2016 г. 14:53:16(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Он там не нужен и проблемы там быть не должно. Или есть? Нужно смотреть в код System.Security.Xml

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Vladimir2008

 


#10
Оставлено
:

11 мая 2016 г. 15:17:15(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Да, проблема в FW 4.0 есть:

Цитата:

System.Security.Cryptography.Xml.SignedXml Information: 17 : [SignedXml#02b3b1be, UnsafeTransformMethod] Метод синхронизации «http://www.w3.org/TR/1999/REC-xpath-19991116» не входит в список безопасных. Безопасны следующие методы синхронизации: «http://www.w3.org/TR/2001/REC-xml-c14n-20010315», «http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments», «http://www.w3.org/2001/10/xml-exc-c14n#», «http://www.w3.org/2001/10/xml-exc-c14n#WithComments», «http://www.w3.org/2000/09/xmldsig#enveloped-signature», «http://www.w3.org/2000/09/xmldsig#base64», «urn:mpeg:mpeg21:2003:01-REL-R-NS:licenseTransform», «http://www.w3.org/2002/07/decrypt#XML».
System.Security.Cryptography.Xml.SignedXml Information: 12 : [SignedXml#02b3b1be, VerificationFailure] Проверка Ссылки не прошла.

Отредактировано пользователем 11 мая 2016 г. 15:18:26(UTC)
 | Причина: Не указана


Вверх
Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Область применения электронной подписи (ЭП или ЭЦП) довольно широка. Например, многие специальные сервисы требуют верификации пользователя с её помощью: Госуслуги, онлайн-сервисы для управления средствами в банке, электронные площадки и другие. Поэтому любые технические неполадки, возникающие при использовании ЭЦП, могут вызвать различные серьёзные: от упущенной выгоды до материальных убытков.

Какие бывают ошибки

Проблемы при использовании ЭП, с которыми пользователи встречаются чаще всего, можно условно разделить на три группы:

  • Проблемы с сертификатом. Они появляются, когда сертификат не выбран, не найден или не верен.
  • Проблемы с подписанием документа. Ошибки возникают при попытке подписать документ.
  • Проблема при авторизации на торговых площадках.

Рассмотрим неполадки подробнее и разберёмся, как их решать.

Сертификат не найден

Иногда при попытке подписать электронный документ с помощью ЭП пользователь может столкнуться с ошибкой «Не удалось найти ни одного сертификата, пригодного для создания подписи».

У подобных ошибок могут быть следующие причины:

  1. На компьютере не установлены корневые сертификаты Удостоверяющего Центра (УЦ), в котором была получена ЭП. Необходимо установить либо обновить корневой сертификат. Установка корневых сертификатов удостоверяющего центра подробно описана в нашей инструкции.
  2. На ПК не установлено ни одного личного сертификата ЭП. Для применения ЭП необходимы и личные сертификаты. Об их установке мы писали в другой статье.
  3. Установленные на компьютере необходимые сертификаты не валидны. Сертификаты отозваны или просрочены. Уточните статус сертификата в УЦ. Ошибка с текстом «Ваш сертификат ключа подписи включён в список отозванных» возникает, если у сертификата закончился срок действия или на ПК нужно обновить список сертификатов. В последней ситуации следует вручную загрузить перечень отозванных сертификатов.

Для установки списка отозванных сертификатов:

  • Откройте личный сертификат пользователя в окне Свойства браузера. Чтобы открыть его, наберите «Свойства браузера» в поисковой строке меню Пуск. Перейдите во вкладку Содержание и нажмите кнопку «Сертификаты».
  • личный сертификат1

  • Во вкладке Состав выберите из списка пункт «Точки распространения списков отзыва».
  • В блоке Имя точки распространения скопируйте ссылку на загрузку файла со списком отзыва.
  • Имя точки2

  • Скачайте по указанной ссылке файл. Нажмите по нему правой кнопкой мыши и выберите в контекстном меню «Установить список отзыва (CRL)».
  • Следуйте указаниям «Мастера импорта сертификатов».

Не виден сертификат на носителе

Как правило, причина такой проблемы — сбой в работе программных компонентов. Для её решения достаточно перезагрузить компьютер. Однако иногда этого бывает недостаточно, поэтому требуется переустановка драйверов или обращение в службу техподдержки.

К наиболее распространённым причинам такой проблемы относятся следующие случаи:

  1. Драйвер носителя не установлен или установлен некорректно. Для решения проблемы необходимо извлечь носитель электронной подписи из ПК и скачать последнюю версию драйвера носителя с официальных ресурсов. Если переустановка драйвера не помогла, подключите носитель к другому ПК, чтобы убедиться в исправности токена. Если токен определится другой системой, попробуйте удалить на неисправном компьютере драйвер носителя и установить его заново.
  2. Долгое опознание носителя. Для решения проблемы необходимо дождаться завершения процесса или обновить версию операционной системы.
  3. Некорректная работа USB-порта. Подключите токен к другому USB-порту, чтобы убедиться, что проблема не в носителе ЭП. Если система определила токен, перезагрузите компьютер. Если это не поможет, следует обратиться службу технической поддержки.
  4. Неисправность носителя. Если при подключении токена к другому компьютеру или USB-порту система не определяет его, значит, проблема в самом носителе. Устранение неисправности возможно в данном случае лишь одним путём — нужно обратиться в сервисный центр для выпуска нового носителя.

ЭП не подписывает документ

Причин у подобной проблемы множество. Каждый случай требует отдельной проверки. Среди самых распространённых можно выделить следующие неполадки:

  1. Закрытый ключ на используемом контейнере не соответствует открытому ключу сертификата. Возможно, был выбран не тот контейнер, поэтому следует проверить все закрытые контейнеры на компьютере. Если необходимый контейнер по тем или иным причинам отсутствует, владельцу придётся обращаться в удостоверяющий центр для перевыпуска ЭП.
  2. Ошибка «Сертификат недействителен» (certificate is not valid). Следует повторно установить сертификат ЭП по инструкциям УЦ в зависимости от используемого криптопровайдера — КриптоПро CSP, ViPNet CSP или другого.
  3. Сертификат ЭП определяется как непроверенный. В этом случае необходимо переустановить корневой сертификат удостоверяющего центра.
  4. Истёк срок действия криптопровайдера. Для решения этой проблемы необходим новый лицензионный ключ к программе-криптопровайдеру. Для его получения необходимо обращаться к специалистам УЦ или к ответственным сотрудникам своей организации.
  5. Подключён носитель с другим сертификатом. Убедитесь, что подключён правильный токен. Проверьте также, не подключены ли носители других сертификатов. Отключите другие носители в случае их обнаружения.

В момент подписания электронных документов или формирования запроса в различных может возникнуть ошибка «Невозможно создание объекта сервером программирования объектов».

подписания3

В этой ситуации помогает установка и регистрация библиотеки Capicom:

  1. Скачайте файл архива.
  2. Распакуйте и переместите файлы capicom.dll и capicom.inf в каталог syswow64, находящийся в корневой папке ОС.
  3. Откройте командную строку от имени администратора — для этого в меню Пуск наберите «Командная строка», нажмите по найденному приложению правой кнопкой мыши и выберите Запуск от имени администратора.
  4. «Командная строка»4

  5. Введите «c:windowssyswow64regsvr32.exe capicom.dll» (без кавычек) и нажмите ENTER. Должно появиться уведомление о том, что команда выполнена успешно.
  6. нажмите ENTER5

Выбранная подпись не авторизована

Подобная ошибка возникает при попытке авторизации в личном кабинете на электронных торговых площадках. Например, при входе на площадку ZakazRF отображается сообщение «Выбранная ЭЦП не авторизована».

площадку ZakazRF6

Эта ошибка возникает из-за того, что пользователь не зарегистрирован на площадке, либо не зарегистрирован новый сертификат ключа ЭП. Решением проблемы будет регистрация нового сертификата.

Процесс запроса на авторизацию ЭП на разных торговых площадках может отличаться: часто нужно отправлять запрос оператору системы на авторизацию, иногда рабочее место настраивается автоматически.
Если ошибка сохраняется, возможно, следует отключить защитное ПО или добавить сайт электронной площадки в исключения.

Часто задаваемые вопросы

Почему компьютер не видит ЭЦП?

Причина кроется в несовместимости программного обеспечения и физического носителя ЭЦП. Необходимо проверить версию операционной системы и переустановить её до нужной версии. Если токен повреждён, возможно, понадобится обратиться в удостоверяющий центр для перевыпуска электронной подписи.

О том, что делать, если компьютер не видит ЭЦП и о способах проверки настроек, мы подробно писали в нашей статье.

Почему КриптоПро не отображает ЭЦП?

Если КриптоПро не отображает ЭЦП, следует проверить настройки браузера. Также исправляет ошибку добавление программы в веб-обозреватель и загрузка недостающих сертификатов электронной подписи.

Подробнее ознакомиться, как устранить данную неисправность можно в нашей статье.

Где на компьютере искать сертификаты ЭЦП?

Сертификат ЭЦП позволяет проверить подлинность подписи, содержит в себе срок её действия и информацию о владельце. Он автоматически загружается в папку с системными файлами. В операционной системе Windows от 7 версии и выше ЭЦП хранится по адресу:

C:UsersПОЛЬЗОВАТЕЛЬAppDataRoamingMicrosoftSystemCertificates. Вместо ПОЛЬЗОВАТЕЛЬ требуется указать наименование используемого компьютера.

Что такое сертификат ЭЦП и зачем он нужен мы рассказали в нашей статье.

Использую библиотеку KalkanCryptCOM.dll (версия — 2.2.0.0) в C#

При попытке проверить подпись xml получаю ошибку если одним и тем же ком объектом проверять две xml, одна из которых подписана Gost, вторая Rsa. Причем порядок проверки не важен, всегда ошибка возникает на второй проверке, т.е. если первым проверяется xml подписанная Rsa, проверка успешная, затем Gost — ошибка. И наоборот, если первый Gost — успешно, вторая Rsa — ошибка.

Ошибка выглядит так:

Error: 0x08F0001C

XMLSec Initialize — OK.

XMLSec load trusted certificates — OK.

XMLSec parse doc — OK.

Get PKI data properties — OK.

Get PKI data properties — OK.

Get PKI data properties — OK.

XMLSec verify xml — found 1 sign(s).

XMLSec-error: func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=356:obj=x509-store:subj=X509_verify_cert:error=4:crypto library function failed:subj=/CN=….serialNumber=…./C=KZ;err=20;msg=unable to get local issuer certificate

XMLSec-error: func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=404:obj=x509-store:subj=unknown:error=71:certificate verification failed:err=20;msg=unable to get local issuer certificate

XMLSec-error: func=xmlSecKeysMngrGetKey:file=keys.c:line=1370:obj=unknown:subj=xmlSecKeysMngrFindKey:error=1:xmlsec library function failed:

XMLSec-error: func=xmlSecTransformSetKey:file=transforms.c:line=1725:obj=unknown:subj=key != NULL:error=100:assertion:

XMLSec-error: func=xmlSecDSigCtxProcessKeyInfoNode:file=xmldsig.c:line=959:obj=unknown:subj=xmlSecTransformSetKey:error=1:xmlsec library function failed:transform=rsa-sha1

XMLSec-error: func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=583:obj=unknown:subj=xmlSecDSigCtxProcessKeyInfoNode:error=1:xmlsec library function failed:

XMLSec-error: func=xmlSecDSigCtxVerify:file=xmldsig.c:line=386:obj=unknown:subj=xmlSecDSigCtxSignatureProcessNode:error=1:xmlsec library function failed:

XMLSec verify xml — FAILED.

XMLSec verify xml — FAILED.

Подскажите пожалуйста, как можно добиться стабильной работы библиотеки при проверке ЭЦП обоих алгоритмов?

PS. та же ошибка возникает и в тестовой утилите (KalkanCryptTest) поставляемой в SDK, достаточно ей скормить подряд две xml (без перезапуска приложения)

Использование ЭЦП открывает для владельца подписи дополнительные возможности. Но вместе с этим, иногда сопровождается небольшими техническими проблемами, связанными с необходимостью чёткого выполнения действий, связанных с загрузкой сертификатов, авторизацией, установкой необходимого программного обеспечения, а также системных требований к компьютеру.

Как выглядит ЭЦП
Важно отметить, что большинство ошибок при работе с ЭЦП можно устранить в домашних условиях, без необходимости привлечения специалистов со стороны.

Содержание

  • Какие виды ошибок ЭЦП бывают
  • Проблема с подписанием ЭПЦ
  • Как проявляется данная ошибка и что сделать, чтобы исправить
  • Проблема с сертификатом
  • Что делать если не найден сертификат или не верен
  • Проблемы при авторизации

Какие виды ошибок ЭЦП бывают

Среди наиболее часто встречающихся ошибок в процессе подписания электронных документов электронной подписью выделяют три ключевых блока:

Проблема с подписанием ЭПЦ. Возникает в момент, когда владелец подписи желает использовать ее при подписании электронного документа.

Проблема с сертификатом. Здесь система информирует пользователя об отсутствии (не действительности), либо использовании незарегистрированного сертификата удостоверяющего центра, необходимого для внешней проверки ЭП.

Проблемы при авторизации. Появляется при проверке пользователя, когда владелец электронной подписи впервые пытается зайти на электронную площадку с подтверждением личности через ЭЦП.

Проблема с подписанием ЭПЦ

Причины, вызывающие подобную ошибку весьма разнообразны. Тут можно выделить такие основные направления:

  • Закрытый ключ со съемного носителя (диска, флешки, Токена), не соответствует имеющемуся ключу открытого сертификата. Банальный человеческий фактор выбора не того носителя информации с ЭЦП. Если же «правильный» ключ утерян, придется обращаться в Удостоверяющий центр для перевыпуска.
  • Недействительный сертификат. Чтобы устранить подобную ошибку потребуется переустановить открытый сертификат. Важно учитывать требования криптопровайдера (инструкции по необходимым действиям) для установки открытых сертификатов.
  • Сертификат подписи определяется как не проверенный. Потребуется выполнить переустановку корневого сертификата, сформировавшего ЭП Удостоверяющего центра.
  • Закончился срок действия криптопровайдера. Необходимо получить новый лицензионный ключ, позволяющий работать с программным обеспечением криптопровайдера. Информация запрашивается через УЦ, либо владельца ПО.
  • Не виден сертификат на носителе. Помогает простая перезагрузка компьютера для устранения ошибка генерации.
  • Алгоритм сертификата ЭЦП не поддерживается. Подобная ошибка может возникать при подписании электронной отчетности в налоговую. Потребуется переустановить КриптоПро CSP и проверить его на совместительство с имеющейся у вас на компьютере операционной системой.

Как проявляется данная ошибка и что сделать, чтобы исправить

Ошибка исполнения функции с информированием о невозможности подписать документ ЭЦП обычно появляется в момент подписания документа.

Система сразу выводит на экран уведомление о непредвиденной ошибке с кратким указанием причины ее возникновения.

Обычно для ее исправления требуются такие действия:

  • проверка наличия, срока действия, подлинности сертификатов и выполнение их замены;
  • выполнение проверки корректной работы операционной системы компьютера, ее обновление до минимальных допустимых параметров;
  • проверка состояния съемного носителя закрытого ключа;
  • выявление и устранение ошибок работы криптопровайдера.

Важно. Причина, из-за которой владелец ЭЦП не может нею воспользоваться, может быть комплексной. Поэтому, если не сработал один из предложенных вариантов, проверьте по другим направлениям.

Проблема с сертификатом

Распространенным явлением во время подписания электронных документов ЭЦП является получение уведомления, что системе не удалось получить доступ к сертификатам, пригодным для формирования подписи.

Здесь причины возникновения неисправности могут быть такими:

  1. Пользователь не установил на свой ПК корневые сертификаты УЦ, осуществлявшего формирование и выдачу ЭЦП. Для устранения – скачать и установить на компьютер такой сертификат, либо прописать доступ к нему.
  2. Система не видит личных сертификатов владельца ЭЦП. Выдаются одновременно с оформлением ЭП. Их необходимо загрузить на ваш ПК, и подтянуть в криптопровайдер. В дальнейшем можно загрузить через сайт УЦ. Устанавливаются и прописываются на рабочем месте, предназначенном для работы с ЭЦП. С незарегистрированным сертификатом вы не сможете осуществлять подписание электронных документов.
  3. Информирование о невалидности сертификатов. Обычно такое возможно в случае, когда заканчивается срок действия сертификата, либо их отзывают. Потребуется обращаться в УЦ, выдавший ЭЦП, для уточнения статуса сертификатов подписи. В некоторых случаях помогает обновление сертификатов на компьютере пользователя. Сделать это можно вручную.

Мнение эксперта

Владимир Аникеев

Специалист отдела технической поддержки УЦ

Внимательно читайте природу ошибки, что выдает система. Обычно это ключ к дальнейшему направлению поиска источника проблемы и ее устранению.

Что делать если не найден сертификат или не верен

Когда сертификат отсутствует в списке «Ваши Сертификаты», проблема может оказаться в отсутствии коренного сертификата УЦ.

Для устранения этой проблемы необходимо:

  • проверить наличие такого сертификата на вашем ПК по пути: «Пуск» — дальше «Все программы» — после этого плагин «КриптоПро» — а уже там «Сертификаты»;
  • дальше находим вкладку «Личное», выбираем «Сертификаты»;

Раздел сертификаты

  • потребуется открыть не отображенный во вкладке сертификат и просмотреть его «Путь сертификации»;
  • тут отображаются все цепочки сертификатов в порядке ранжирования. Важно чтобы напротив какого-то из них не стоял желтый, либо красный значок предупреждения. Если подобное присутствует – нажмите на сам сертификат и ознакомьтесь с ошибкой, что выдаст система;
  • в зависимости от причины (обычно это окончание действия сертификата, либо не верифицирован) выполните ее устранение.

Чтобы устранить ошибку и перезагрузить отозванный сертификат потребуется выполнить несколько не сложных действий:

  • в окне «Свойства браузера» откройте личный сертификат. Попасть туда можно через «Поиск» меню «Пуск». В открытом окошке ищите вкладку «Содержание», дальше вкладку «Сертификаты»;
  • после этого во вкладке «Состав» потребуется выбрать позицию «Точки распространения списков отзывов»;
  • в следующем блоке под названием «Имя точки распространения» необходимо выполнить копирование ссылки загрузки файла списка отзывов;
  • переходя по указанной ссылке необходимо скачать и установить файл списка отзывов (CRL);
  • дальше переходим по подсказкам «Мастера импорта сертификатов».

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

  1. На носителе отсутствует драйвер, либо он установлен не корректно. Необходимо скачать последнюю версию драйвера с официального источника и установите его. Можно проверить работоспособность съемного носителя на другом ПК. В этом случае, если другой ПК нормально работает с носителем ЭЦП, переустановите драйверы на первом компьютере.
  2. Система долго распознает носитель ЭЦП. Тут проблема в операционной системе. Ее потребуется обновить до минимального уровня, требуемого для работы с ЭЦП.
  3. USB-порт работает не корректно. Попробуйте подсоединить Токен (флешку) через другой порт, либо на другом ПК, чтобы убедиться, что проблема не в носителе. Выполните перезагрузку компьютера.
  4. Если Токин (флешка) не открывается ни на одном компьютере, значит проблема в носителе. Когда ключ был записан в единственном экземпляре на этот носитель – потребуется обращаться в УЦ для перевыпуска ЭЦП.

Важно. Перед вынесением «окончательного вердикта» касательно работоспособности носителя и сертификата, не поленитесь выполнить их проверку через несколько различных источников.

Проблемы при авторизации

Часто с подобными неприятностями сталкиваются владельцы ЭЦП, пытающиеся пройти регистрацию, либо авторизацию на различных электронных торговых площадках. Пользователю появляется уведомление, что его подпись не авторизирована.

Обычно проблема кроется:

  1. Отсутствие регистрации. Потребуется попросту зарегистрироваться на избранном вами ресурсе.
  2. Не зарегистрирован сертификат. Возникает после обновления ключа ЭЦП. Устраняется путем регистрации нового сертификата ключа ЭЦП.

Мнение эксперта

Владимир Аникеев

Специалист отдела технической поддержки УЦ

На различных ресурсах процесс регистрации (авторизации) может существенно отличаться, иметь определенные ограничения, а также блокироваться защитным ПО. Поэтому перед началом процедуры не поленитесь ознакомиться с соответствующей инструкцией и правилами.

В дальнейшем, при работе на самой электронной площадке и попытке подписать электронные документы, могут возникать дополнительные трудности, связанные с такими моментами:

  1. Необходимости присоединиться к регламенту. Система не даст возможность полноценно работать, если вы не согласитесь с ее условиями.
  2. Невозможность загрузить файл (файлы). Обычно это ошибка превышения размера информации, что допустима для загрузки. Просто смените формат разрешения файла, чтобы уменьшить его размер.
  3. Требование использовать определенный браузер (определенную версию браузера). Это системные требования владельца площадки, которые необходимо соблюдать.
  4. Проблемы со считыванием сертификатов. Потребуется проверить не просрочены ли ваши сертификаты, а также все ли они установлены на ПК.

Что значит er 10002 неопределенная ошибка при проверке ЭЦП, что делать?

Возможно не прошла расшифровка файла ключа. Перезагрузите компьютер. Проверьте, отображается ли съемный носитель ключа ЭЦП, наличие и корректность отображения сертификатов, а также соответствие их (должен быть одинаковый владелец).

Ошибка 52 цифровая подпись

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

Почему компьютер не видит ЭЦП?

Несоответствие программного продукта операционной системы и съемного носителя (флешки), либо повреждение флешки. Устраняется путем обновления операционной системы до минимально необходимой версии. В случае обнаружения повреждения флешки – может потребоваться перевыпуск ЭЦП удостоверяющим центром.

Почему КриптоПро не отображает ЭЦП?

Потребуется выполнить определенные настройки вашего браузера и добавить программу в меню веб-обозревателя, а также загрузить недостающие сертификаты ЭЦП.

Где на компьютере искать сертификаты ЭЦП?

Хранение сертификатов в Windows (от 7 версии) осуществляется по адресу: C:UsersПОЛЬЗОВАТЕЛЬAppDataRoamingMicrosoftSystemCertificates

где вместо «ПОЛЬЗОВАТЕЛЬ» должно стоять наименование вашего ПК

На одном из идущих в настоящее время проектов решалась задача подписания (наложения ЭП — электронной подписи) XML документов, а именно SOAP-пакетов. Рекомендованным форматом был

OASIS Standard 200401 с профилем
X.509 Certificate Token Profile. Эти документы описывают применение созданного www-консорциумом (W3C) формата электронных подписей XML (XMLDSig — XML Digital Signature) в SOAP-сообщениях. XML-подписи, как и другие виды ЭП, поддерживают аутентификацию, целостность
данных и неотрекаемость от подписания данных.

Отмечу несколько особенностей формата XMLDSig:

1. Объектом подписания может служить не весь XML-документ, а только его часть, т.е. определённый узел. Согласно

OASIS Standard 200401 подписываемым объектом является тело (узел Body) SOAP-сообщения.

2. Различные части XML-документа могут быть подписаны несколькими исполнителями.

3. XML-подпись может находиться на разных уровнях по отношению к подписываемому объекту:

  • в структуре подписи может находиться URI
    (унифицированный идентификатор ресурса);
  • XML-подпись может находиться на одном уровне с подписываемым узлом;
  • XML-подпись может находиться внутри подписываемого узла;
  • подписываемый узел может находиться внутри структуры XML-подписи.

4. Для проверки действительности ЭП необходим доступ к объекту подписания.

Структура SOAP-коверта

В общем случае сообщение состоит из заголовка и тела:
Header и Body. Header содержит метаданные, а
Body данные. XML-подпись помещается в узел Header.

Криптографические алгоритмы и каноникализация.

Для решения задачи были использованы ГОСТ Р 34.11-94 — российский криптографический стандарт вычисления хеш-функции и
ГОСТ Р 34.10-2001 — стандарт электронной подписи.

В силу гибкости правил составления XML, одна и та же структура документа и одна и та же часть информации могут быть представлены различными XML-документами. Рассмотрим два документа:

 

С логической точки зрения они равнозначны, то есть имеют одинаковую XML-схему. Но XML-файлы этих листингов не содержат одну и ту же последовательность символов, что повлечёт разные результаты, например, при получении значения хэша.

Во избежание подобных разночтений были приняты строгие правила форматирования и требования к содержанию XML-сообщений. Процесс приведения XML-документов к унифицированному (каноническому) виду называют
каноникализацией (англ. Canonicalization). Примерами правил может быть применение определённой схемы кодирования (UTF-8), нормализация значений атрибутов, использование двойдых кавычек для значений атрибутов, определённый порядок атрибутов
и объявлений пространств имён, и др. Каноникализация XML бывает нескольких видов, которые отличаются составом правил. Побробнее о процессе каноникализации можно прочитать в официальной
спецификации W3C (русскоязычные статьи на эту тему можно найти
здесь и
здесь)

Библиотека SIRCrypt

Для реализации подписания XML в DIRECTUM была написана COM-библиотека, внутри которорй описаны 3 класса:
Hasher, Signer и XMLCanonicalizer для получения хэша, значения ЭП и каноникализации XML-документов соответственно.

Для функционирования библиотеки требуется Crypto PRO CSP
(тестировалась на версии Crypto PRO CSP 3.6.6497 KC2) и
.NET (минимально 2.0).

Регистрация библиотеки выполняется выполнением следующей команды:

> regasm.exe «путь к dll» /codebase /tlb

Объект Hasher для вычисления хэша по ГОСТ

Содержит поля Content (тип ‘строка’) и
HashValueAsBase64 (тип ‘строка’), а также метод для вычисления значения хэш-функции
Hash(). Для вычисления необходимо означить Content, вызвать метод
Hash(), в результате которого в поле HashValueAsBase64
запишется значение хэш-функции в Base64.

Объект Signer для получения значения ЭП по ГОСТ

Содержит поля Content (тип ‘строка’),
ContainerName (тип ‘строка’), CertificateAsPEM
(тип ‘строка’), BESignatureValueAsBase64 (тип ‘строка’), метод
Sign(). После инициализации объекта необходимо означить
Content
(данные для подписания), ContainerName
(имя контейнера закрытого ключа сертификата), вызвать метод Sign(). После чего в поле
CertificateAsPEM попадёт соответствующий закрытому ключу сертификат в Base64, а в поле
BESignatureValueAsBase64 значение подписи в виде Base64-строки.

Объект XMLCanonicalizer для каноникализации XML

Содержит поля XMLContent (тип ‘строка’),
CanonicalXML (тип ‘строка’), метод C14NExc(). Для получения канонической формы XML нужно означить
XMLContent, вызвать C14NExc(), получить результат из поля
CanonicalXML.

Создание подписи выглядит следующим образом: сначала формируется основа soap-пакета, узлы
Header и Body. Body заполняется данными и добавляется атрибут
wsu:ID=»Body» — идентификатор подписываемых данных.

Далее нужно подготовить структуру Security
и включить её в Header.

Заполнение структуры Security происходит в следующем порядке:

  1. Берётся значение хэш-функции от узла Body в каноническом виде и помещается в узел DigestValue.
  2. Узел SignedInfo приводится к каноническому виду, подписывается ЭП. Результат в формате Base64-строки попадает в узел
    SignatureValue.
  3. Открытый ключ сертификата, которым было выполнено подписание помещается в узел
    BinarySecurityToken в формате строки Base64.

Для того, чтобы проверить сформированную таким образом ЭП необходимо проделать все действия в обратном порядке, а именно:

  1. получить каноническую форму элемента SignedInfo.
  2. С использованием резльтата предыдущего шага проверить, действительно ли значение ЭП из узла
    SignatureValue с помощью открытого ключа сертификата. На данном этапе проверяется только корректность ЭП, что не гарантирует неизменность данных.
  3. Если проверка действительности ЭП пройдена успешно, сравнивается хэш из узла
    DigestValue и хэш от узла с данными. Если они неравны, то подписанные данные изменены и вся ЭП недействительна.

Пример использования

XML-документ до подписания:
SOAPEnvelope.xml (266,00 байт)

Подписанный XML-документ:
SignedSOAPEnvelope.xml (3,32 Кб)

Пакет разработки и библиотека

Примеры подписания XML на ISBL (сценарий):
dev.zip (5,95 Кб)

Для постоянного использования код, выполняющий типовое подписание готового SOAP-конверта, вынесен в функцию
SignSOAP().

Для подписания используется сертификат из личного хранилища сертификатов текущего пользователя.

Cертификат для тесподписания можно получить на
тестовом центре сертификации КриптоПРО.

Библиотека SIRCrypt:
SIRCrypt.zip (7,42 Кб)

Интеграция с Честным Знаком

Я

  

1СникСоСтажем

14.05.22 — 18:23

Всем привет! Делаю интеграцию 1с с честным знаком. Задача получать входящие документы и их подписывать.

1. Ключ сессии (/api/v1/session) получаю вполне корректно, Честный знак принимает подпись

2. Входящие документы получаю корректно, но при попытке подписи документов (api/v1/incoming-documents/xml/upd/title) ошибка «Подпись не прошла проверку в crypto» (хотя при получении ключа сессии все нормально)

Ниже пример использования:

ПодписатьТекст(ЗашифроватьBase64(ФайлXML, «windows-1251»),Отпечаток,Истина);

// sThumbprint — отпечаток сертификата, используемого для подписи; строка,

// представляющая отпечаток в шестнадцатеричном виде

// пример 195934d72dcdf69149901d6632aca4562d8806d8

// ТекстДляПодписи должен быть в Base64

// bDetached — Истина/Ложь — откреплённая(для подписания документов)/прикреплённая(для получения токена авторизации) подпись

Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)

    

    CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64

    CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи

    CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи

    

    oSigner = Новый COMОбъект(«CAdESCOM.CPSigner»);

    // Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.

    oSigner.Certificate = ПолучитьСертификатПоОтпечатку(sThumbprint);

    oSigningTimeAttr = Новый COMОбъект(«CAdESCOM.CPAttribute»);

    oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;

    oSigningTimeAttr.Value = ТекущаяДата();

    oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);

    
    ТекстДляПодписи = СокрЛП(ТекстДляПодписи);

    

    oSignedData = Новый COMОбъект(«CAdESCOM.CadesSignedData»);

    // Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.

    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;

    //oSignedData.propset_ContentEncoding = CADESCOM_BASE64_TO_BINARY;

    oSignedData.Content = СокрЛП(ТекстДляПодписи);

    EncodingType = 0;

    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE,

    bDetached, EncodingType);

    // Метод добавляет к сообщению усовершенствованную подпись.

    sSignedMessage = СтрЗаменить(sSignedMessage,Символы.ПС,»»);

    sSignedMessage = СтрЗаменить(sSignedMessage,Символы.ВК,»»);

    
    Возврат sSignedMessage; // Подпись в формате Base64

    
КонецФункции

//Отпечаток — строка HEX

Функция ПолучитьСертификатПоОтпечатку(ОтпечатокСтр)

    

    Рез = Неопределено; // Найденный сертификат (Com-объект)

    CAPICOM_CURRENT_USER_STORE = 2;

    //2 — Искать сертификат в ветке «Личное» хранилища.

    CAPICOM_MY_STORE = «My»;

    // Указываем, что ветку «Личное» берем из хранилища текущего пользователя

    CAPICOM_STORE_OPEN_READ_ONLY = 0; // Открыть хранилище только на чтение

    oStore = Новый COMОбъект(«CAdESCOM.Store»); // Объект описывает хранилище сертификатов

    

    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,

    CAPICOM_STORE_OPEN_READ_ONLY); // Открыть хранилище сертификатов

    // 1 вариант: поиск сертификата по отпечатку

    //CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;

    //Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, ОтпечатокСтр);

    //Рез = Certificates.Item(1);

    

    //2 вариант: обходом по коллекции и сравнение с отпечатком

    Для Каждого ТекСертификат Из oStore.Certificates Цикл

        ТекОтпечаток = ТекСертификат.Thumbprint; // возвращается отпечаток в шестнадцатеричном виде

        Если ВРЕГ(ТекОтпечаток) = ВРЕГ(ОтпечатокСтр) Тогда Рез = ТекСертификат;

            Прервать;

        КонецЕсли;

    КонецЦикла;

    oStore.Close(); // Закрыть хранилище сертификатов и освободить объект 61

    Возврат Рез;

    
КонецФункции

ТекстДляПодписи — содержание XML файла

У клиента менялся сертификат, может быть в этом причина? Хотя при «ручном» подписании ошибок нет.

Кто сталкивался? Отзовитесь плиз…..

  

NorthWind

1 — 14.05.22 — 18:29

А штамп времени там реально нужен?

  

NorthWind

2 — 14.05.22 — 18:33

у меня есть образец рабочего кода такой фигни, но там простая подпись CADES_BES, без штампа времени. Здесь используется штамп времени, но я что-то не уверен, что он применяется у Честного знака, во всяком случае, упоминаний об этом я не нашел. Он там применяется или нет?

  

1СникСоСтажем

3 — 14.05.22 — 19:04

(2) добрый день! Хороший вопрос! Кол не мой. Предлагаете штамм времени опустить? У Вас что — то аналогичное используется в реализации?

  

NorthWind

4 — 14.05.22 — 19:27

(3) а ключ сессии вы этим же методом подписываете?

  

1СникСоСтажем

5 — 14.05.22 — 20:00

(4) ну да.bDetached Ложь только.  Там в описании функции указано.

  

timurhv

6 — 14.05.22 — 20:10

Куда сейчас документацию API выкладывают? Раньше в телеге выкладывали, сейчас — фиг разберешься.

Исходный xml отправляете ведь с подписанным? Через base64Строка прогнать и отправить?

  

1СникСоСтажем

7 — 14.05.22 — 21:27

(6) у нах сайт лёг кстати. Успел вытащить описание до санкций.

Да, файл покупателя уже с подписанным файлом от продавца. Вначале в base64, а потом уже подписываем.

Плюс в тело post запроса подпись самого файла от покупателя.

Попробую без CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME. Отпишусь. Думаю,  что всем полезно знать решение

  

1СникСоСтажем

8 — 14.05.22 — 23:02

(2)

Решил отказаться от штамма времени в алгоритме при подписании документов:

Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)

    

    CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64

    CADESCOM_CADES_TYPE       = 1; // Тип усовершенствованной подписи

    //CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи

    

    oSigner = Новый COMОбъект(«CAdESCOM.CPSigner»);

    // Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.

    oSigner.Certificate = ПолучитьСертификатПоОтпечатку(sThumbprint);

    

    // при подписании документов не используем штамп времени

    Если Не bDetached Тогда

        oSigningTimeAttr = Новый COMОбъект(«CAdESCOM.CPAttribute»);

        oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;

        oSigningTimeAttr.Value = ТекущаяДатаСеанса();    

        oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);

    КонецЕсли;

    
    ТекстДляПодписи = СокрЛП(ТекстДляПодписи);

    

    oSignedData = Новый COMОбъект(«CAdESCOM.CadesSignedData»);

    // Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.

    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;

    //oSignedData.propset_ContentEncoding = CADESCOM_BASE64_TO_BINARY;

    oSignedData.Content = СокрЛП(ТекстДляПодписи);

    EncodingType = 0;

    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE,

    bDetached, EncodingType);

    // Метод добавляет к сообщению усовершенствованную подпись.

    sSignedMessage = СтрЗаменить(sSignedMessage,Символы.ПС,»»);

    sSignedMessage = СтрЗаменить(sSignedMessage,Символы.ВК,»»);

    
    Возврат sSignedMessage; // Подпись в формате Base64

    
КонецФункции

Но ничего не изменилось. А Вы говорили, что у Вас есть рабочий код для подписи? Можете поделиться? Спасибо

  

H A D G E H O G s

9 — 14.05.22 — 23:08

Каждый раз читаю это и каждый раз благодарю судьбу, что мы отказались поддерживать ЧЗ.

  

H A D G E H O G s

10 — 14.05.22 — 23:11

Создателям этой жлыги можно пожелать встретить голландскую шхуну..

  

timurhv

11 — 14.05.22 — 23:16

(9) В БСП 1 функция вызывается. Но у автора, видимо, свой велосипед

  

H A D G E H O G s

12 — 14.05.22 — 23:20

(11) Да понятно, что в БСП одна функция, но что-то иногда идет не так. И это не отменяет ебаклакизм ЧЗ, которые забили на запилить приложуху на стороне клиента или хотя бы dll.

  

1СникСоСтажем

13 — 14.05.22 — 23:58

(11)

Не всегда БСПшные функции работают корректно. Велосипед, да. Но нужно в нем разобраться.

  

1СникСоСтажем

14 — 14.05.22 — 23:58

(12)

Тут согласен полностью. Но имеем то, что имеем.

  

NorthWind

15 — 15.05.22 — 09:22

(8)

    def find_cert(self, hash_str):

        «»»

        ищет сертификат в хранилище сертификатов по его sha1-отпечатку

        «»»

        current_user_store = 2

        my_store = «my»

        store_open_read_only = 0

        capicom_certificate_find_sha1_hash = 0

        store = win32com.client.Dispatch(«CADESCOM.store»)

        store.Open(current_user_store, my_store, store_open_read_only)

        certs = store.Certificates.Find(capicom_certificate_find_sha1_hash, hash_str)

        if certs.Count > 0:

            self.cert = certs.Item(1)

    # —————————————————————————————————————

    def sign(self, filename: str, prefix: str):

        «»»

        подписывает файл с переданным именем

        «»»

        cades_bes = 1

        capicom_encode_base64 = 0

        capicom_certificate_include_end_entity_only = 2

        sign_filename = self.get_bin_filename(filename, prefix)

        signer = win32com.client.Dispatch(«CADESCOM.CpSigner»)

        signer.Certificate = self.cert

        signer.Options = capicom_certificate_include_end_entity_only

        signed_data = win32com.client.Dispatch(«CADESCOM.CadesSignedData»)

        f_in = open(filename, ‘rb’)

        signed_data.Content = f_in.read()

        out_data = signed_data.SignCades(signer, cades_bes, True, capicom_encode_base64)

        f_out = open(sign_filename, ‘wt’)

        f_out.write(out_data)

        f_in.close()

        f_out.close()

  

1СникСоСтажем

16 — 15.05.22 — 10:40

(15)

Доброе утро! Что это за язык программирования? Думал пример на 1с :)

1. Поиск сертификата по sha-1 обязательно искать? У меня просто идёт поиск по коллекции сертификатов.

2.

А self, win32com и prefix что означают?

  

NorthWind

17 — 15.05.22 — 11:08

(16) это python.

Поиск сертификата есть и у вас, реализован практически точно так же как и в моем случае.

win32com.client это механизм для работы с COM-объектами на python, то же самое что Новый COMОбъект () в 1С.

prefix это строчка, которая добавляется слева к имени файла подписи, для ваших целей это вряд ли нужно.

Вообще у вас вполне нормальный код, только он сильно замусорен непонятно зачем нужными опциями: сертификат ищется двумя способами, к подписи добавляются какие-то атрибуты и штамп времени… Возможно, все это нужно ЧЗ. Или нет? У меня на этот счет сомнения.

  

1СникСоСтажем

18 — 15.05.22 — 11:38

(17)

Смотрю да. Надо короче пробовать. Но мы же текстовое содержимое файлов xml файлов подписываем? Пробовал уйти от времени — результат тот же. Подумаем короче…

  

1СникСоСтажем

19 — 15.05.22 — 11:39

(17)

Сам алгоритм то рабочий,  сессию же я получаю без проблем. Проблемы с подписью документов.

  

timurhv

20 — 15.05.22 — 13:11

(19) Для токена:

ПараметрыCMS = ЭлектроннаяПодписьКлиент.ПараметрыCMS();

ПараметрыCMS.Открепленная = Ложь;

Для Национальный каталог, True Api, ГИС МТ:

ПараметрыCMS.Открепленная = Истина;

  

1СникСоСтажем

21 — 15.05.22 — 13:45

(20)

Добрый день! А  подробнее можно? Куда этот параметр CMS вставить?

  

1СникСоСтажем

22 — 15.05.22 — 18:04

Причем сверил сам отпечаток. Полностью совпадает  с тем, как тут получают. Так что проблем серфикатом быть не должно

ДанныеСертификата = Сертификат.ДанныеСертификата.Получить();

ск = Новый СертификатКриптографии(ДанныеСертификата);

Отпечаток = ПолучитьHexСтрокуИзДвоичныхДанных(ск.Отпечаток);

Ниже код, как я заполняю справочников сертификатов (отдельный сделал, БСПшный не стал использовать):

ОбъектСертификат.Наименование        = ВладелецСертификата;

ОбъектСертификат.ВладелецСертификата = ВладелецСертификата;

ОбъектСертификат.ДатаНачала          = ТекСертификат.ValidFromDate;

ОбъектСертификат.ДатаОкончания       = ТекСертификат.ValidToDate;

ОбъектСертификат.Контейнер           = ТекСертификат.PrivateKey.UniqueContainerName;

ОбъектСертификат.Отпечаток           = ТекСертификат.Thumbprint;

        
ОбъектСертификат.Записать();

Отказался от CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME. результат тот же…

  

1СникСоСтажем

23 — 16.05.22 — 00:40

Народ, тут до меня дошло, что нужно использовать «Новый МенеджерКриптографии» (мне же открепленная подпись нужна). Тут вопрос по параметрам? Где их взять? У кого — нибудь есть рабочий пример?

  

1СникСоСтажем

24 — 16.05.22 — 00:54

Вот код:

Функция ПодписатьТекстОтсоединеннаяПодпись(ТекстДляПодписи,Отпечаток)

    
    ФайлСПодписями = ПолучитьИмяВременногоФайла(«txt»);

    

    МенеджерКриптографии = Новый МенеджерКриптографии(«Microsoft Enhanced Cryptographic Provider v1.0″,»»,1);

    Хранилище  = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);

    Сертификат = Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(Отпечаток));

        
    ДД_Подпись =  МенеджерКриптографии.Подписать(ТекстДляПодписи,ФайлСПодписями,Сертификат);

    
    Возврат ПолучитьСтрокуИзДвоичныхДанных(ДД_Подпись,»windows-1251″);

КонецФункции // ПодписатьТекстОтсоединеннаяПодпись()

Но получаю ошибку:

ОбщийМодуль.vvoИнтеграция.Модуль(986)}: Ошибка при вызове метода контекста (Подписать)

    ДД_Подпись =  МенеджерКриптографии.Подписать(ТекстДляПодписи,ФайлСПодписями,Сертификат);

по причине:

Ошибка операции с файлом.

по причине:

Каталог не обнаружен ‘PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0id2luZG93cy0xMjUxIiAPg0KPNTg6esgwuXw8cw7uM9ItHB6NEzIiDC5fDx1O7w7D0iNS4wMSIgyOTU4OnrPSJPTl9OU…. Там очень длинный текст.

Как заставить его работать?

  

Тихий омут

25 — 16.05.22 — 03:37

Использую для ГИИС, но может, найдёшь что полезное.

Стр — ссылка на эл. справочника СертификатыКлючейЭлектроннойПодписиИШифрования

Код на базе БСП 3.1.5.385

КриптоСертификат=Новый СертификатКриптографии(Стр.ДанныеСертификата.Получить()); //двоичные данные сертификата

МенеджерКриптографии=Новый МенеджерКриптографии(Стр.СертификатИмяПрограммы,»»,Стр.СертификатТипПрограммы); //из того же справочника

ПараметрыXMLDSig=ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыXMLDSig();

МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу=»****»;

ПодписанныйПакет=ЭлектроннаяПодписьСлужебный.Подписать(ТелоПакета,ПараметрыXMLDSig,КриптоСертификат,МенеджерКриптографии);

  

NorthWind

26 — 16.05.22 — 08:24

(24) судя по строке ошибки, вы задаете само содержимое подписи в виде строки base64 в качестве имени файла, и пытаетесь такой файл сохранить.

  

1СникСоСтажем

27 — 16.05.22 — 22:42

(26)

Добрый день! Именно так и есть, хотя бы подпись получил. Ниже код, как я это делаю.

Причем ФайлXML_ДД — двоичные данные XML файла. Если отправлять содержимое XML файла — то будет ошибка, описанная выше.

То есть вначале подпись, а потом уже ее в Base64/ На что еще обратить внимание? Подписываю файл продавца и титул покупателя одинаково

ПодписатьТекстОтсоединеннаяПодпись(ФайлXML_ДД,Отпечаток)

Функция ПодписатьТекстОтсоединеннаяПодпись(Файл_ДД,Отпечаток)

    

    МенеджерКриптографии = Новый МенеджерКриптографии(«Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider»,»»,80);

    Хранилище            = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);

    Сертификат           = Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(Отпечаток));

        
    ДД_Подпись = МенеджерКриптографии.Подписать(Файл_ДД,Сертификат);

        
    Результат = Base64Строка(ДД_Подпись);

    

    Если Лев(Результат, 4) = «77u/» Тогда

        Результат = Сред(Результат, 5);

    КонецЕсли;

    

    Результат = СтрЗаменить(Результат, Символы.ПС, «»);

    Результат = СтрЗаменить(Результат, Символы.ВК, «»);

    Возврат Результат;

КонецФункции // ПодписатьТекстОтсоединеннаяПодпись()

Ошибка формирования подписи

Просмотр 6 сообщений — с 1 по 6 (из 6 всего)

  • Автор

    Сообщения

  • 21.05.2021 в 13:15

    #16506

    Добрый день. При формировании подписи выдает следующие: Ошибка формирования подписи
    Дальнейшее выполнение операций остановлено!
    Что это означает и как это исправить

    24.05.2021 в 10:44

    #16519

    Проверьте настройки криптопровайдера Крипто-ПРО. Убедитесь, что в системе (панель Сертификаты) у Вашего сертификата не стоит красная метка.

    18.03.2022 в 05:56

    #20567

    Доброе время суток! вчера на ноутбук переносил все свое хозяйство! операционка там стоит Win10pro. Ставлю свою криптопро4, эцп (закрытый и открытый сертификаты), все как положено! открываю Конструктор, подписываю ТП, все нормально, на второй раз выскакивает — «Ошибка формирования подписи», танцы с бубном, настройки ни какие не помогают! сертификат установился корректно, криптопро его видит без красненьких огоньков! Експлорер сертификат тоже видит без замечаниЙ! помогает только переустановка криптопро, и то на один раз (один раз подписывает и опять вышеперечисленное вверху).
    Есть подозрение что криптопро4 не корректно работает на win10pro в программе Конструктор! Кто владеет информацией, по данной проблеме либо подобной, проясните пож-та!

    15.04.2022 в 09:14

    #20825

    У меня на 10-ке установлен 5-й КриптоПро. Подобных проблем не наблюдал.

    11.11.2022 в 21:48

    #23600

    Точно такая байда. Хоть лопни. Выдаёт «Ошибка формирования подписи.Дальнейшее выполнение операций остановлено!». Переустанавливаешь ПростоПодписать, можешь подписывать, проверять подпись в пределах одного сеанса. Программу закрыл, открыл и всё, больше ничего не подпишешь. Что за хрень? Кто-то решил эту проблему?

    13.11.2022 в 13:03

    #23611

    Программа нестабильно работает с 4-й версией Крипто Про. Для стабильной работы программы используйте Крипто Про 5-й версии.

  • Автор

    Сообщения

Просмотр 6 сообщений — с 1 по 6 (из 6 всего)

Для ответа в этой теме необходимо авторизоваться.

В узле SignInfo у меня есть

<ds:Reference URI="#Id-132">...

Это относится к узлу ниже:

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-132">

Команда:

xmlsec1 --sign --output request-signed.xml --privkey-pem privatekey.pem raw_message.xml

У меня такая ошибка: func = xmlSecXPathDataExecute: file = xpath.c: line = 273: obj = unknown: subj = xmlXPtrEval: error = 5: ошибка библиотечной функции libxml2: expr = xpointer (id (‘Id-132’))

1 ответ

Лучший ответ

Для подписи с помощью идентификаторов ссылок необходим параметр --id-attr:. Пример:

<ds:Reference URI="#Id-132">

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-132">

Команда: xmlsec1 --sign --output request-signed.xml --privkey-pem privatekey.pem --id-attr:Id raw_message.xml

Дополнительная информация: https: //snippets.aktagon.com/snippets/758-how-to-sign-xml-documents-using-xmldsig-xml-signature-


0

Julián Cortés
20 Ноя 2018 в 00:23


Offline

Vladimir2008

 


#1
Оставлено
:

6 мая 2016 г. 17:14:47(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Установлены Windows 10 (64-битная), КриптоПро CSP 3.9.8423, КриптоПро .Net 1.0.5913.0.
Создаю подпись в XML-документе через примеры в C:Program Files (x86)Crypto Pro.NET SDKExamples4.0, запускаю в командной строке:

Цитата:

SimpleCS.exe Xml.SignDocument mycert

Создается и проверяется успешно.
До тех пор, пока не установлю некие обновления Windows, а именно (перечисляю под все версии Windows, на которых срабатывает также):
— На Windows 7 обновления KB3135983 и KB3136000
— На Windows 8 — KB3135985 и KB3135998 (возможно, еще — KB3135994)
— На Windows 10 — KB3140768 и KB3147458
— также обновление KB3135996
Если эти обновления установлены, то подпись формируется, но не проверяется — signedXml.CheckSignature() всегда выдает false (на этом месте рушится в моем программе). Если говорить о примере, указанном выше, сообщение такое:

Цитата:

Создан новый XML файл.
XML подписан.
Подпись не верна.

Как только обновления деинсталлированы — опять все работает.
От версии .Net Framework — не зависит — проблема и на 2.0 и 4.0.
Просьба прокомментировать, как с этим бороться, поскольку обновления приходится сносить не с одного рабочего места (их (мест) относительно много).

В случае, когда успешно (обновления не установлены):
doc_to_sign.xml (1kb) загружен 4 раз(а).
doc_signed.xml (4kb) загружен 9 раз(а).

Эти файлы — когда обновления установлены (не проверяется подпись):
doc_to_sign.xml (1kb) загружен 3 раз(а).
doc_signed.xml (4kb) загружен 7 раз(а).


Вверх


Offline

Максим Коллегин

 


#2
Оставлено
:

6 мая 2016 г. 18:40:37(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,296
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 680 раз в 599 постах

А если подпись сделать до обновления, а проверять после установки?
И файлы вы приложили идентичные.
Попробуйте убрать smev трансформ из подписи, может с ним проблема.

Отредактировано пользователем 6 мая 2016 г. 18:41:55(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Vladimir2008

 


#3
Оставлено
:

10 мая 2016 г. 10:12:56(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Да, проблема в указанном примере была именно в smev-трансформе, если его убрать, то работает, точнее работает преобразование:

Цитата:

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);

Проблема возникает, когда хочется подписать несколькими ЭП, причем не сразу всеми, когда известно их кол-во. Если кол-во известно, то две строки кода

Цитата:

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);

нужно прописать столько раз, сколько подписей (во всяком случае — так работает). Но если заранее неизвестно их кол-во, то писать эти две строки «с запасом» — неправильно.
Проблему решал другой трансформ:

Цитата:

XmlDsigXPathTransform xpath = CreateXPathTransform();
reference.AddTransform(xpath);

где

Цитата:

private static XmlDsigXPathTransform CreateXPathTransform()
{
XmlDocument doc = new XmlDocument();

doc.LoadXml(«<XPath xmlns:dsig=»http://www.w3.org/2000/09/xmldsig#»>»
+ «not(ancestor-or-self::dsig:Signature)</XPath>»);
XmlElement xPathElem = (XmlElement)doc.SelectSingleNode(«/XPath»);

XmlDsigXPathTransform xForm = new XmlDsigXPathTransform();

xForm.LoadInnerXml(xPathElem.SelectNodes(«.»));

return xForm;
}

Но с учетом указанных выше обновлений — это не работает. Подпись создается корректной, но валидацию на компе с такими обновлениями Windows не проходит. Т.е., получается КриптоПро .Net работает не 100%-но (в разных версиях Windows)?

Отредактировано пользователем 10 мая 2016 г. 11:02:45(UTC)
 | Причина: Не указана


Вверх


Offline

Максим Коллегин

 


#4
Оставлено
:

10 мая 2016 г. 13:10:06(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,296
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 680 раз в 599 постах

Возможно в трансформе есть неточность — посмотрим.

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Максим Коллегин

 


#5
Оставлено
:

11 мая 2016 г. 10:32:03(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,296
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 680 раз в 599 постах

Очень интересное вскрылось.
MS ввели понятие safe transform. Увидел, рассматривая код рефлектором.
Ошибку можно отследить, включив лог SignedXml, как написано тут:
https://social.msdn.micr…buglog?forum=xmlandnetfx

Цитата:

System.Security.Cryptography.Xml.SignedXml Information: 17 : [SignedXml#01475d71, UnsafeTransformMethod] Canonicalization method «urn://smev-gov-ru/xmldsig/transform» is not on the safe list. Safe canonicalization methods are: «http://www.w3.org/TR/2001/REC-xml-c14n-20010315», «http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments»,

Лечится добавлением кода в проверку:

Код:

signedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");

Отредактировано пользователем 11 мая 2016 г. 10:38:21(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW

thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.

vadimromanov

оставлено 13.12.2016(UTC)


Offline

Vladimir2008

 


#6
Оставлено
:

11 мая 2016 г. 11:50:11(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

SafeCanonicalizationMethods — где взять аналог для Framework 4.0?
И как быть с преобразованием XmlDsigXPathTransform (не smev)?

Отредактировано пользователем 11 мая 2016 г. 11:56:22(UTC)
 | Причина: Не указана


Вверх


Offline

Максим Коллегин

 


#7
Оставлено
:

11 мая 2016 г. 13:25:05(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,296
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 680 раз в 599 постах

Код, судя по всему, в зависимости от версии Framework ветвиться не умеет — собирайте отдельно для 4.5.1 и для более ранних.
Для XmlDsigXPathTransform — добавьте в SafeCanonicalizationMethods XmlDsigXPathTransform.Algorithm

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Vladimir2008

 


#8
Оставлено
:

11 мая 2016 г. 13:36:03(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Вопрос в том и состоит — как сделать аналог SafeCanonicalizationMethods (появился только в FW 4.5.1) для FW 4.0 ?


Вверх


Offline

Максим Коллегин

 


#9
Оставлено
:

11 мая 2016 г. 14:53:16(UTC)

Максим Коллегин

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

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,296
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 680 раз в 599 постах

Он там не нужен и проблемы там быть не должно. Или есть? Нужно смотреть в код System.Security.Xml

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Vladimir2008

 


#10
Оставлено
:

11 мая 2016 г. 15:17:15(UTC)

Vladimir2008

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

Группы: Участники

Зарегистрирован: 04.06.2008(UTC)
Сообщений: 41
Откуда: Москва

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

Да, проблема в FW 4.0 есть:

Цитата:

System.Security.Cryptography.Xml.SignedXml Information: 17 : [SignedXml#02b3b1be, UnsafeTransformMethod] Метод синхронизации «http://www.w3.org/TR/1999/REC-xpath-19991116» не входит в список безопасных. Безопасны следующие методы синхронизации: «http://www.w3.org/TR/2001/REC-xml-c14n-20010315», «http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments», «http://www.w3.org/2001/10/xml-exc-c14n#», «http://www.w3.org/2001/10/xml-exc-c14n#WithComments», «http://www.w3.org/2000/09/xmldsig#enveloped-signature», «http://www.w3.org/2000/09/xmldsig#base64», «urn:mpeg:mpeg21:2003:01-REL-R-NS:licenseTransform», «http://www.w3.org/2002/07/decrypt#XML».
System.Security.Cryptography.Xml.SignedXml Information: 12 : [SignedXml#02b3b1be, VerificationFailure] Проверка Ссылки не прошла.

Отредактировано пользователем 11 мая 2016 г. 15:18:26(UTC)
 | Причина: Не указана


Вверх

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

На одном из идущих в настоящее время проектов решалась задача подписания (наложения ЭП — электронной подписи) XML документов, а именно SOAP-пакетов. Рекомендованным форматом был

OASIS Standard 200401 с профилем
X.509 Certificate Token Profile. Эти документы описывают применение созданного www-консорциумом (W3C) формата электронных подписей XML (XMLDSig — XML Digital Signature) в SOAP-сообщениях. XML-подписи, как и другие виды ЭП, поддерживают аутентификацию, целостность
данных и неотрекаемость от подписания данных.

Отмечу несколько особенностей формата XMLDSig:

1. Объектом подписания может служить не весь XML-документ, а только его часть, т.е. определённый узел. Согласно

OASIS Standard 200401 подписываемым объектом является тело (узел Body) SOAP-сообщения.

2. Различные части XML-документа могут быть подписаны несколькими исполнителями.

3. XML-подпись может находиться на разных уровнях по отношению к подписываемому объекту:

  • в структуре подписи может находиться URI
    (унифицированный идентификатор ресурса);
  • XML-подпись может находиться на одном уровне с подписываемым узлом;
  • XML-подпись может находиться внутри подписываемого узла;
  • подписываемый узел может находиться внутри структуры XML-подписи.

4. Для проверки действительности ЭП необходим доступ к объекту подписания.

Структура SOAP-коверта

В общем случае сообщение состоит из заголовка и тела:
Header и Body. Header содержит метаданные, а
Body данные. XML-подпись помещается в узел Header.

Криптографические алгоритмы и каноникализация.

Для решения задачи были использованы ГОСТ Р 34.11-94 — российский криптографический стандарт вычисления хеш-функции и
ГОСТ Р 34.10-2001 — стандарт электронной подписи.

В силу гибкости правил составления XML, одна и та же структура документа и одна и та же часть информации могут быть представлены различными XML-документами. Рассмотрим два документа:

 

С логической точки зрения они равнозначны, то есть имеют одинаковую XML-схему. Но XML-файлы этих листингов не содержат одну и ту же последовательность символов, что повлечёт разные результаты, например, при получении значения хэша.

Во избежание подобных разночтений были приняты строгие правила форматирования и требования к содержанию XML-сообщений. Процесс приведения XML-документов к унифицированному (каноническому) виду называют
каноникализацией (англ. Canonicalization). Примерами правил может быть применение определённой схемы кодирования (UTF-8), нормализация значений атрибутов, использование двойдых кавычек для значений атрибутов, определённый порядок атрибутов
и объявлений пространств имён, и др. Каноникализация XML бывает нескольких видов, которые отличаются составом правил. Побробнее о процессе каноникализации можно прочитать в официальной
спецификации W3C (русскоязычные статьи на эту тему можно найти
здесь и
здесь)

Библиотека SIRCrypt

Для реализации подписания XML в DIRECTUM была написана COM-библиотека, внутри которорй описаны 3 класса:
Hasher, Signer и XMLCanonicalizer для получения хэша, значения ЭП и каноникализации XML-документов соответственно.

Для функционирования библиотеки требуется Crypto PRO CSP
(тестировалась на версии Crypto PRO CSP 3.6.6497 KC2) и
.NET (минимально 2.0).

Регистрация библиотеки выполняется выполнением следующей команды:

> regasm.exe «путь к dll» /codebase /tlb

Объект Hasher для вычисления хэша по ГОСТ

Содержит поля Content (тип ‘строка’) и
HashValueAsBase64 (тип ‘строка’), а также метод для вычисления значения хэш-функции
Hash(). Для вычисления необходимо означить Content, вызвать метод
Hash(), в результате которого в поле HashValueAsBase64
запишется значение хэш-функции в Base64.

Объект Signer для получения значения ЭП по ГОСТ

Содержит поля Content (тип ‘строка’),
ContainerName (тип ‘строка’), CertificateAsPEM
(тип ‘строка’), BESignatureValueAsBase64 (тип ‘строка’), метод
Sign(). После инициализации объекта необходимо означить
Content
(данные для подписания), ContainerName
(имя контейнера закрытого ключа сертификата), вызвать метод Sign(). После чего в поле
CertificateAsPEM попадёт соответствующий закрытому ключу сертификат в Base64, а в поле
BESignatureValueAsBase64 значение подписи в виде Base64-строки.

Объект XMLCanonicalizer для каноникализации XML

Содержит поля XMLContent (тип ‘строка’),
CanonicalXML (тип ‘строка’), метод C14NExc(). Для получения канонической формы XML нужно означить
XMLContent, вызвать C14NExc(), получить результат из поля
CanonicalXML.

Структура XML-подписи

Создание подписи выглядит следующим образом: сначала формируется основа soap-пакета, узлы
Header и Body. Body заполняется данными и добавляется атрибут
wsu:ID=»Body» — идентификатор подписываемых данных.

Далее нужно подготовить структуру Security
и включить её в Header.

Заполнение структуры Security происходит в следующем порядке:

  1. Берётся значение хэш-функции от узла Body в каноническом виде и помещается в узел DigestValue.
  2. Узел SignedInfo приводится к каноническому виду, подписывается ЭП. Результат в формате Base64-строки попадает в узел
    SignatureValue.
  3. Открытый ключ сертификата, которым было выполнено подписание помещается в узел
    BinarySecurityToken в формате строки Base64.

Для того, чтобы проверить сформированную таким образом ЭП необходимо проделать все действия в обратном порядке, а именно:

  1. получить каноническую форму элемента SignedInfo.
  2. С использованием резльтата предыдущего шага проверить, действительно ли значение ЭП из узла
    SignatureValue с помощью открытого ключа сертификата. На данном этапе проверяется только корректность ЭП, что не гарантирует неизменность данных.
  3. Если проверка действительности ЭП пройдена успешно, сравнивается хэш из узла
    DigestValue и хэш от узла с данными. Если они неравны, то подписанные данные изменены и вся ЭП недействительна.

Пример использования

XML-документ до подписания:
SOAPEnvelope.xml (266,00 байт)

Подписанный XML-документ:
SignedSOAPEnvelope.xml (3,32 Кб)

Пакет разработки и библиотека

Примеры подписания XML на ISBL (сценарий):
dev.zip (5,95 Кб)

Для постоянного использования код, выполняющий типовое подписание готового SOAP-конверта, вынесен в функцию
SignSOAP().

Для подписания используется сертификат из личного хранилища сертификатов текущего пользователя.

Cертификат для тесподписания можно получить на
тестовом центре сертификации КриптоПРО.

Библиотека SIRCrypt:
SIRCrypt.zip (7,42 Кб)

Использую библиотеку KalkanCryptCOM.dll (версия — 2.2.0.0) в C#

При попытке проверить подпись xml получаю ошибку если одним и тем же ком объектом проверять две xml, одна из которых подписана Gost, вторая Rsa. Причем порядок проверки не важен, всегда ошибка возникает на второй проверке, т.е. если первым проверяется xml подписанная Rsa, проверка успешная, затем Gost — ошибка. И наоборот, если первый Gost — успешно, вторая Rsa — ошибка.

Ошибка выглядит так:

Error: 0x08F0001C

XMLSec Initialize — OK.

XMLSec load trusted certificates — OK.

XMLSec parse doc — OK.

Get PKI data properties — OK.

Get PKI data properties — OK.

Get PKI data properties — OK.

XMLSec verify xml — found 1 sign(s).

XMLSec-error: func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=356:obj=x509-store:subj=X509_verify_cert:error=4:crypto library function failed:subj=/CN=….serialNumber=…./C=KZ;err=20;msg=unable to get local issuer certificate

XMLSec-error: func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=404:obj=x509-store:subj=unknown:error=71:certificate verification failed:err=20;msg=unable to get local issuer certificate

XMLSec-error: func=xmlSecKeysMngrGetKey:file=keys.c:line=1370:obj=unknown:subj=xmlSecKeysMngrFindKey:error=1:xmlsec library function failed:

XMLSec-error: func=xmlSecTransformSetKey:file=transforms.c:line=1725:obj=unknown:subj=key != NULL:error=100:assertion:

XMLSec-error: func=xmlSecDSigCtxProcessKeyInfoNode:file=xmldsig.c:line=959:obj=unknown:subj=xmlSecTransformSetKey:error=1:xmlsec library function failed:transform=rsa-sha1

XMLSec-error: func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=583:obj=unknown:subj=xmlSecDSigCtxProcessKeyInfoNode:error=1:xmlsec library function failed:

XMLSec-error: func=xmlSecDSigCtxVerify:file=xmldsig.c:line=386:obj=unknown:subj=xmlSecDSigCtxSignatureProcessNode:error=1:xmlsec library function failed:

XMLSec verify xml — FAILED.

XMLSec verify xml — FAILED.

Подскажите пожалуйста, как можно добиться стабильной работы библиотеки при проверке ЭЦП обоих алгоритмов?

PS. та же ошибка возникает и в тестовой утилите (KalkanCryptTest) поставляемой в SDK, достаточно ей скормить подряд две xml (без перезапуска приложения)

In the SignInfo node I have

<ds:Reference URI="#Id-132">...

It refers to the node below:

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-132">

Command:

xmlsec1 --sign --output request-signed.xml --privkey-pem privatekey.pem raw_message.xml

I have this error:
func=xmlSecXPathDataExecute:file=xpath.c:line=273:obj=unknown:subj=xmlXPtrEval:error=5:libxml2 library function failed:expr=xpointer(id(‘Id-132’))

  • Ошибка подписания эцп причины
  • Ошибка подписания файла ошибка при создании подписи ошибка исполнения функции 0x8007065b
  • Ошибка подписания файла ошибка при создании подписи не удается построить цепочку сертификатов
  • Ошибка подписания указан неправильный алгоритм 0x80090008 roseltorg
  • Ошибка подписания произошла ошибка curthumbprint is not defined