在创建对遵循 xml-dsig 标准的数字签名元素的引用时,“id”属性的情况是否重要?
我已经看到名为“ID”、“Id”和“id”的属性,并且一些软件包无法为不同的表单找到正确的元素/节点。
同样遵循各种规范和模式,预计会有不同的 id 属性。
确定该属性必须命名为“id”,但是否指定了大小写或只有建议?
在创建对遵循 xml-dsig 标准的数字签名元素的引用时,“id”属性的情况是否重要?
我已经看到名为“ID”、“Id”和“id”的属性,并且一些软件包无法为不同的表单找到正确的元素/节点。
同样遵循各种规范和模式,预计会有不同的 id 属性。
确定该属性必须命名为“id”,但是否指定了大小写或只有建议?
本质问题是双重的。首先,如您所知,XML 区分大小写。
其次,XML 没有“定义”ID 属性的名称。与说元素可能具有“id”属性的 HTML 不同,XML 本身没有。存在类型的概念,但默认情况下不提供xs:ID
属性名称(例如 、ID
、Id
或id
) 。myIdentifier
作为参考,请参阅W3C 如何解决标识 ID 语义的问题......?.
因此,一些解析软件假定id
,有些假定任何id
, ID
, Id
,有些假定没有。
更具体地说,我通常会ID
在 SAML 签名中看到 的用法。常用的命令xmlsec1
不标识要使用的名称,因此您必须这样做。例如:
xmlsec1 --decrypt --privkey-pem /foo/key.pem --id-attr:ID EncryptedKey my.xml
告诉 xmlsec1ID
在节点上(仅)将命名属性声明为EncryptedKey
已知的 xs:ID 属性。它似乎是加法的:你可以做多个:
xmlsec1 --decrypt ... --id-attr:Id EncryptedKey --id-attr:ID EncryptedKey --id-attr:id EncryptedKey
将在 EncryptedKey 节点上使用 any。
(您可以声明foobar
为 xs:ID 属性,它会正常工作,因此,如果您的源 XML 具有以下内容:
<node foobar="1234"/>
<otherNode URI="#1234"/>
利用:
xmlsec1 --id-attr:foobar node ...
(注意:你一定知道我不是xml-dsig专家,所以我只回答XML、DTD和XML Schema的问题。)
XML 区分大小写,因此大小写很重要,并且必须与您使用的 DTD 或 Schema 中的相同。
当然,如果应用程序在不同的情况下使用不同的模式,就会出现兼容性问题。
我查看了http://www.w3.org/TR/xmldsig-core/上的官方 W3C 规范, Schema 和 DTD 似乎指定了“Id”。这是您使用的规范吗?
此外,如果知道相应的 DTD 类型是“ID”并且有一个名为“id”的 XQuery 函数,这可能会让人感到困惑。