1

我想创建一个包含多个引用相同数据的独立签名的文件。我希望将数据存储输出 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 元素必须包含带有 ObjectReference 的 SignedDataObjectProperties,并且 SignedInfo 的 Reference 元素中的 URI 应该指向该文件。

4

1 回答 1

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>

有了这个,假设有 2 个不同配置的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 属性定义为其 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>
于 2015-08-13T21:19:49.487 回答