SignedXml неправильно обрабатывает атрибуты пространства имен xml

Симптомы

Не удается проверить подпись xml как под классом SignedXml.

<tns:CertificateStatusResponse xmlns="" xmlns:dpfunc="" xml:id="response">
<tns:ReturnCode>00</tns:ReturnCode>
<tns:ReturnText>OK</tns:ReturnText>
<tns:CertificateStatus>
  <tns:CertificateSerialNo>3419000000001401</tns:CertificateSerialNo>
  <tns:CertificateType>signing</tns:CertificateType>
  <tns:MatchingCertificateSerialNo>3419000000001402</tns:MatchingCertificateSerialNo>
  <tns:Status><tns:revoked revocationDate="2011-01-21T10:12:04Z" CRLReason="1"/></tns:Status>
</tns:CertificateStatus>
<tns:Timestamp>2011-02-02T14:53:47Z</tns:Timestamp>
<tns:RequestId>hls=</tns:RequestId>
< подпись xmlns =»#">
<SignedInfo>
< алгоритм CanonicalizationMethod =»>
< алгоритм SignatureMethod =»>
< URI ссылки = «#response» >
    <Transforms>
< алгоритм преобразования =»>
< алгоритм преобразования =»>
    </Transforms>
< алгоритм DigestMethod =»>
    <DigestValue>4hTmTRbInGChuyeqoRs06Tug30s=</DigestValue>
  </Reference>
</SignedInfo>
<SignatureValue>jHG4+lRvqs1g8ZRLCdND7lT7qFQr6YnzQ...</SignatureValue>
<KeyInfo>
 <X509Data>
   <X509Certificate>MIIEADCCAuigAwIBAgIFAMa3vBEwDQYJKoZIhvcNAQELB...</X509Certificate>
  </X509Data>
</KeyInfo>
</Signature>
</tns:CertificateStatusResponse>

Причина

При попытке проверить подпись SignedXml.CheckSignature() он канонизирует SignedInfo узел и неправильно наследует атрибуты пространства имен xml. В этом случае xml:id наследуется до SignedInfo, которое не должно произойти и подпись недействительной.

Решение

В .NET 4.0 это можно исправить путем регистрации пользовательского преобразования алгоритма канонизации. Пользовательское преобразование делегирует встроенного преобразования Exc14N и удаляет атрибут пространства имен xml.

Класс пользовательского преобразования является очень короткий и прямой вперед.
открытый класс MyXmlDsigExcC14NTransform: XmlDsigExcC14NTransform
{
открытый MyXmlDsigExcC14NTransform() {}

переопределить Public void LoadInput(Object obj)
   {           
Корень XmlElement = ((XmlDocument) obj). DocumentElement;
Если (корень. Имя == «SignedInfo») корня. RemoveAttribute("xml:id");
Базовое значение. LoadInput(obj);
   }
}

В начале приложения MyXmlDsigExcC14NTransform могут быть зарегистрированы на следующий вызов:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "");

При вызове SignedXml.CheckSignature() MyXmlDsigExcC14NTransform вызывается для выполнения канонизации, который удаляет атрибут xml:id.

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×