【问题标题】:XAdES internally detached signatureXAdES 内部分离签名
【发布时间】:2015-11-05 18:17:35
【问题描述】:

我想创建一个包含多个引用相同数据的独立签名的文件。我希望将数据存储在输出 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 验证模块失败遇到&lt;/internally-detached&gt;标签后。

XAdES 是否可以实现内部分离签名?如果可以,我该如何实现?

我知道当数据存储在单独的文件中时,可能会有多个签名:每个签名的 SignedProperties 元素必须包含带有 ObjectReference 的 SignedDataObjectProperties,并且 SignedInfo 的 Reference 元素中的 URI 应该指向该文件。

【问题讨论】:

    标签: xml digital-signature xades4j


    【解决方案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);
    

    请注意,您需要define the "data" element's Id attribute as its 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>
    

    【讨论】:

    • 谢谢,很遗憾,我的验证软件没有将生成的签名显示为有效签名(当然是在将其与基本 XML 文档合并后)-“证书完整性错误”。我所说的“xades4j 甚至不允许......”的意思是 xades4j 验证模块为我手动编辑的签名文件返回错误(我已将问题更新为更具体)。我对最终输出的签名文件结构比如何在 xades4j 中更感兴趣(我必须自己实现签名),也许你可以发布一个例子?
    • 奇怪;它应该是有效的。 “合并”是什么意思?您应该只需要在最后序列化 DOM 文档并使用生成的文件进行验证。至于最终输出,我已经更新了答案。如果您需要有关 XAdES 结构的详细信息,请查看包含示例的 xades4j 测试。
    • 好的,我做到了(输出文件与我“合并”时的文件相同 - 我手动将整个文件放在一起;)。证书的序列号写成负数 - 这就是(我认为)签名无效的原因。
    • 如果是这种情况,可能是验证软件的问题。原始问题已解决。让我知道是否可以帮助解决更多问题。
    • @bmscicho "The serial number MUST be a positive integer assigned by the CA to each certificate." 我以前见过软件在这方面失败,这是一个有效的检查——如果可能有点严格的话。但对于 RFC,MUST 是必须的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 2020-08-23
    • 2020-08-29
    相关资源
    最近更新 更多