У меня есть XML-документ, в котором мне нужно проверить подпись. Элемент SignedInfo имеет элемент CanonicalizationMethod, который определяет алгоритм "http://www.w3.org/2001/10/xml-exc-c14n#", а также имеет дочерний элемент InclusiveNamespaces с заполненным атрибутом PrefixList, например:
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>...
Я использую следующий код для создания своего объекта C14Transform:
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform(false, "soapenv");
где "soapenv"
происходит от атрибута PrefixList
.
При канонизации приведенного выше XML (игнорируя пробелы) он должен выглядеть так (обратите внимание на часть xmlns:soapenv="..."
в строке 2):
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>
...
У меня проблема в том, что часть xmlns:soapenv="..."
не включается при канонизации, что приводит к сбою проверки подписи.
Я могу обойти это, вставив его программно, но это проблема, так как будут вариации содержимого PrefixList.