Имам 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.