Проблем при проверка на XML подпис с XmlDsigExcC14NTransform и InclusiveNamespaces

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


person elSeten    schedule 18.06.2015    source източник
comment
Съмнявам се, че можете да направите много. Къде магически би извел uri за декларацията на пространството от имена, която трябва да добави? Не трябва ли оригиналът да има този атрибут, ако е необходим за проверка на подписа?   -  person Charles Mager    schedule 18.06.2015
comment
Декларацията за пространство от имена вече съществува в xml документа, просто някъде другаде. Надявах се да има някаква настройка на трансформиращия обект, която трябва да включа, така че каноничната версия да излезе правилна. Имам потвърждение, че това работи правилно на други езици, поне php. Освен това InclusiveNamespaces е част от стандарта Exclusive Canonicalization W3C, така че предполагам, че Microsoft го покрива.   -  person elSeten    schedule 18.06.2015


Отговори (1)


Може би този формуляр за публикация на Microsoft може да ви помогне: https://support.microsoft.com/en-us/kb/2639079

Те ви показват как да регистрирате персонализирана трансформация за алгоритъма за канонизиране. Използва се за премахване на пространство от имена, но мисля, че можете да го използвате и за добавяне на такова.

public class  MyXmlDsigExcC14NTransform : XmlDsigExcC14NTransform 
{ 
   public MyXmlDsigExcC14NTransform() {} 

   public override  void LoadInput(Object obj) 
   {            
      XmlElement root = ((XmlDocument)obj).DocumentElement; 
      if (root.Name == "SignedInfo") root.RemoveAttribute("xml:id");            
      base.LoadInput(obj);                      
   } 
}

В началото на вашето приложение MyXmlDsigExcC14NTransform може да се регистрира със следното извикване:

CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#"); 
person Patrick Koorevaar    schedule 21.07.2015
comment
Хей, благодаря за това. Това е по-чисто от това, което правя в момента, но все пак тайно се надявах библиотеката на Microsoft да обработва правилно списъците с префикси. - person elSeten; 23.07.2015