Xmldsig - - - xml, сайт спільноти directum

Зазначу кілька особливостей формату XMLDSig:

2. Різні частини XML-документа можуть бути підписані декількома виконавцями.

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

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

4. Для перевірки дійсності ЕП необхідний доступ до об'єкта підписання.

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

У загальному випадку повідомлення складається з заголовка і тіла: Header і Body. Header містить метадані, а Body дані. XML-підпис поміщається в вузол Header.

Xmldsig - - - xml, сайт спільноти directum

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

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

З логічної точки зору вони рівнозначні, тобто мають однакову XML-схему. Але XML-файли цих лістингів не містять одну і ту ж послідовність символів, що спричинить різні результати, наприклад, при отриманні значення хеша.

бібліотека 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-підписи

Xmldsig - - - xml, сайт спільноти directum

Створення підпису виглядає наступним чином: спочатку формується основа 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 на ISBL (сценарій): dev.zip (5,95 Кб)

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

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