XAdES внутренне отделенная подпись

Я хочу создать файл, содержащий несколько независимых подписей, ссылающихся на одни и те же данные. Я хочу, чтобы данные хранились в выходном XML-файле как родственные элементы ds:Signature, как показано ниже (только с несколькими ds:Signature элементами):

<?xml version="1.0" encoding="UTF-8"?>
<internally-detached>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod 
         Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      <ds:SignatureMethod 
         Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <ds:Reference URI="#data">
        <ds:DigestMethod 
          Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <ds:DigestValue/>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue/>
  </ds:Signature>

  <document Id="data">
     <title>title</title>
     <author>writer</author>
     <date>today</date>
     <content>
        <para>First paragraph</para>
        <para>Second paragraph</para>
     </content>
  </document>
</internally-detached>

Источник: https://msdn.microsoft.com/en-us/library/ms759193(v=vs.85).aspx (мне известно, что на сайте не упоминается стандарт XAdES).

Я попытался применить это к действительной охватывающей подписи XAdES и поместить указанный узел ds:Object за пределы элемента ds:Signature, но программа проверки возвращает ошибку (указанный узел не найден), и модуль проверки xades4j не работает после обнаружения тега </internally-detached>.

Возможна ли внутренняя отделенная подпись с помощью XAdES? Если да, как я могу этого добиться?

Я знаю, что несколько подписей возможны, когда данные хранятся в отдельном файле: элемент SignedProperties каждой подписи должен содержать SignedDataObjectProperties с ObjectReference, а URI в элементе Reference SignedInfo должен указывать на файл.


person bmscicho    schedule 12.08.2015    source источник


Ответы (1)


Это, безусловно, возможно с подписями XAdES, поскольку они также являются «обычными» подписями XML.

Я не уверен, что вы имеете в виду под «xades4j даже не допускает корневого узла, кроме ds:Signature»; ваша цель может быть легко достигнута.

Предполагая, что у вас есть базовый XML-документ без каких-либо подписей (либо из файла, либо созданный с помощью DOM API):

<internally-detached>
  <document Id="data">
     <title>title</title>
     <author>writer</author>
     <date>today</date>
     <content>
        <para>First paragraph</para>
        <para>Second paragraph</para>
     </content>
  </document>
</internally-detached>

Имея это и, скажем, два по-разному настроенных экземпляра XadesSigner, вы можете сделать что-то вроде:

XadesSigner signer1 = ...;
XadesSigner signer2 = ...;
Document doc = ...; // your base XML
Element signaturesParent = doc.getDocumentElement();

SignedDataObjects objs = new SignedDataObjects(new DataObjectReference("#data"));
signer1.sign(obj, signaturesParent);
signer2.sign(obj, signaturesParent);

Просто помните, что вам нужно определить атрибут Id элемента data в качестве его XML ID.

В результате должен получиться документ, похожий на:

<internally-detached>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  ...
  </ds:Signature>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  ...
  </ds:Signature>
  <document Id="data">
     <title>title</title>
     <author>writer</author>
     <date>today</date>
     <content>
        <para>First paragraph</para>
        <para>Second paragraph</para>
     </content>
  </document>
</internally-detached>
person lgoncalves    schedule 13.08.2015
comment
Спасибо, к сожалению, мое программное обеспечение для проверки не показывает сгенерированную подпись как действительную (конечно, после объединения ее с базовым XML-документом) - ошибка целостности сертификата. То, что я имел в виду под xades4j, даже не позволяет ... это то, что модуль проверки xades4j возвращает ошибку для моего вручную отредактированного файла подписи (я обновил вопрос, чтобы быть более конкретным). Меня больше интересует структура файла окончательной выходной подписи, чем то, как это сделать в xades4j (мне нужно реализовать подпись самостоятельно), может, вы могли бы опубликовать пример? - person bmscicho; 14.08.2015
comment
Странный; он должен быть действительным. Что вы имеете в виду под слиянием? Вам просто нужно сериализовать документ DOM в конце и использовать полученный файл для проверки. Что касается окончательного результата, я обновил ответ. Если вам нужны подробности о структуре XAdES, взгляните на тесты xades4j, которые содержат образцы. - person lgoncalves; 14.08.2015
comment
Хорошо, я сделал это (и выходной файл такой же, как и при слиянии - я собрал весь файл вручную;). Серийный номер сертификата записан как отрицательное число - и именно поэтому (я думаю) подпись недействительна. - person bmscicho; 14.08.2015
comment
Если это так, вероятно, проблема в программном обеспечении для проверки. Исходный вопрос решен. Сообщите мне, если я могу помочь с дальнейшими проблемами. - person lgoncalves; 15.08.2015
comment
@bmscicho Серийный номер ДОЛЖЕН быть положительным целым числом, присвоенным ЦС каждому сертификату. Я раньше видел, как программное обеспечение отказывает в этом, это действительная проверка - если возможно, немного строгая. Но для RFC ОБЯЗАТЕЛЬНО ОБЯЗАТЕЛЬНО. - person Maarten Bodewes; 27.08.2015