在XML文件中签名元素时出现“id”属性的情况

时间:2010-03-19 13:33:41

标签: xml signature xml-signature

在xml-dsig标准之后创建对数字签名元素的引用时,“id”属性的情况是否重要?

我见过名为“ID”,“Id”和“id”的属性,有些软件包无法为不同的表单找到正确的元素/节点。

同样遵循各种规范和模式,预期会有不同的id属性。

确定该属性必须命名为“id”,但是是指定的情况还是只有推荐?

2 个答案:

答案 0 :(得分:1)

(注意:你必须知道我不是xml-dsig专家,所以我只是回答XML,DTD和XML Schema。)

XML区分大小写,因此案例很重要,必须与您使用的DTD或Schema中的相同。

当然,如果应用程序使用不同的模式,但存在兼容性问题。

我查看了http://www.w3.org/TR/xmldsig-core/处的官方W3C规范,Schema和DTD似乎指定了“Id”。这是您正在使用的规范吗?

另外,知道对应的DTD类型是“ID”并且有一个名为“id”的XQuery函数可能会令人困惑。

答案 1 :(得分:1)

基本问题有两个。首先,众所周知,XML区分大小写。

第二,XML不会“定义” ID属性的名称。与HTML表示元素可能具有'id'属性的HTML不同,XML本身没有。存在xs:ID类型的概念,但未提供属性名称(例如IDIdidmyIdentifier)默认情况下。

有关参考,请参见W3C How should the problem of identifying ID semantics ... be addressed...?

因此,某些解析软件假设id,有些假设idIDId中的任何一个,

更具体地说,我通常会在SAML签名中看到ID的用法。常用命令xmlsec1不能标识要使用的名称,因此必须使用。例如:

xmlsec1 --decrypt --privkey-pem /foo/key.pem --id-attr:ID EncryptedKey my.xml

告诉xmlsec1声明ID节点上的命名EncryptedKey属性(仅)为已知的xs:ID属性。似乎可以加成:您可以做多种:

xmlsec1 --decrypt ... --id-attr:Id EncryptedKey --id-attr:ID EncryptedKey --id-attr:id EncryptedKey 

将在EncryptedKey节点上使用任何

(您可以将foobar声明为xs:ID属性,它将正常工作,因此,如果您的源XML具有以下内容:

<node foobar="1234"/>
<otherNode URI="#1234"/>

使用:

xmlsec1 --id-attr:foobar node ...