Симптомы
Не удается проверить подпись 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.