Цитата:А это не ошибка ли использовать расширение SOAP для того чтобы подписать не SOAP пакет? На мой взгляд это выглядит довольно странно.
Зависит от схемы документа. Если сама схема имеет атрибут Id соответствующего типа, то правильнее использовать его. Если схема не запрещает атрибуты других пространств имен и своего атрибута нет, то почему бы не использовать стандартизированное расширение, которое широко поддерживается. Если же ни своего атрибута, ни разрешения на другие пространства имен, то приходится выкручиваться без Id (например, через XPath трансформ).
Цитата:Это описано в каком-то стандарте? Я не увидел такого спецэффекта см. код ниже
1) То что его не видно, это не значит, что его нет. Пример должен быть похитрее - в статье после спойлера. Конечно, в стандарте неэксклюзивной каноникализации в версии 1.0 описано, раздел Document Subsets. Идентификатор этой версии фактически используется в шаблонах электронной подписи, на нее ссылается стандарт эксклюзивной каноникализации и даже есть RFC3076.
Тут важно понимать, что стандарты эксклюзивной (+ неэксклюзивной) каноникализации и электронной подписи - "три большие разницы" и могут применяться по отдельности. Сочетание определено в стандарте, заметьте для версии 1.0 должно использовать идентификатор версии 1.0, для версии 1.1 - идентификатор версии 1.1. Если пишите идентификатор версии 1.0, но на самом деле применяете 1.1, это логическая ошибка и потенциальная проблема совместимости.
Поехали смотреть стандарты, ссылки и идентификаторы:
Цитата:https://www.w3.org/TR/2001/REC-xml-c14n-20010315#DocSubsets All element nodes along E's ancestor axis are examined for nearest occurrences of attributes in the xml namespace, such as xml:lang and xml:space (whether or not they are in the node-set). From this list of attributes, remove any that are in E's attribute axis (whether or not they are in the node-set). Then, lexicographically merge this attribute list with the nodes of E's attribute axis that are in the node-set. The result of visiting the attribute axis is computed by processing the attribute nodes in this merged attribute list.
В пересказе - при неэксклюзивной каноникализации узла Е проводится поиск ближайшего узла предка по каждому из атрибутов xml:*, потом из этого списка исключаются атрибуты которые есть у самого узла и списки соединяются. Объединенный список атрибутов идет на обработку далее.
Цитата:https://www.w3.org/TR/xml-exc-c14n/#sec-Terminology The exclusive canonical form of a document subset is a physical representation of the XPath node-set, as an octet sequence, produced by the method described in this specification. It is as defined in the Canonical XML Recommendation [XML-C14N] except for the changes summarized as follows:
- attributes in the XML namespace, such as xml:lang and xml:space are not imported into orphan nodes of the document subset, and
- namespace nodes that are not on the InclusiveNamespaces PrefixList are expressed only in start tags where they are visible and if they are not in effect from an output ancestor of that tag.
привожу ради ссылки [XML-C14N]
Вкратце (только важное для этого вопроса): при эксклюзивной каноникализации предки
за пределами фрагмента игнорируются, но для предков внутри фрагмента - процедура не меняется. Другими словами, от множения xml:id в родительском теге внутри фрагмента на дочерние теги эксклюзивность не спасет, но атрибут будет скрыт для дочерних тегов.
Смотрим стандарт подписи, какие идентификаторы разрешены (но могут быть и другие опционально):
Последняя версия
https://www.w3.org/TR/xmldsig-core/ правда разрешает версии поновее (и нужно их все уметь обработать):
Статья о замечаниях прямо из хранилища стандартов
https://www.w3.org/TR/C14N-issues/#S3 поясняющая суть: первая версия каноникализации вышла раньше чем появился xml:id, по ней все получается как я описал выше. Для такого случая не рекомендовано использовать каноникализацию (на тот момент версии 1.0).
Статья про xml:id, и с идеей как с его помощью легко сломать c14n и подпись
https://www.xml.com/pub/a/ws/2005/02/23/salz.htmlДля полноты (вдруг кто еще заинтересуется): статья про каноникализацию "на пальцах".
2) Сейчас просмотрел и новейшую версию неэксклюзивной каноникализации. В версии 1.1 внесли поправку, исключающую наследование некоторых атрибутов, в том числе и xml:id. Возможно каноникализатор из Вашего кода использует новую версию. Тем не менее, если указываются старые идентификаторы алгоритмов, использовать новую версию каноникализации рискованно.