XAdES 内部分离签名
XAdES internally detached signature
我想创建一个包含引用相同数据的多个独立签名的文件。我希望数据存储 in 输出 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
元素之外,但验证软件 returns 出错(引用的节点是未找到),xades4j验证模块在遇到</internally-detached>
标签后失败。
XAdES 可以使用内部分离签名吗?如果可以,我该如何实现?
我知道当数据存储在一个单独的文件中时,多个签名是可能的:每个签名的 SignedProperties 元素必须包含带有 ObjectReference 的 SignedDataObjectProperties,并且 SignedInfo 的 Reference 元素中的 URI 应该指向该文件。
XAdES 签名当然可以,因为它们也是 "regular" XML 签名。
我不确定你说的 "xades4j doesn't even allow a root node other than ds:Signature
" 是什么意思;你的objective可以轻松实现。
假设您拥有没有任何签名的基本 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 的 2 个不同配置的实例,您可以执行以下操作:
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>
我想创建一个包含引用相同数据的多个独立签名的文件。我希望数据存储 in 输出 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
元素之外,但验证软件 returns 出错(引用的节点是未找到),xades4j验证模块在遇到</internally-detached>
标签后失败。
XAdES 可以使用内部分离签名吗?如果可以,我该如何实现?
我知道当数据存储在一个单独的文件中时,多个签名是可能的:每个签名的 SignedProperties 元素必须包含带有 ObjectReference 的 SignedDataObjectProperties,并且 SignedInfo 的 Reference 元素中的 URI 应该指向该文件。
XAdES 签名当然可以,因为它们也是 "regular" XML 签名。
我不确定你说的 "xades4j doesn't even allow a root node other than ds:Signature
" 是什么意思;你的objective可以轻松实现。
假设您拥有没有任何签名的基本 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 的 2 个不同配置的实例,您可以执行以下操作:
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>