SignedXml nezpracovává správně Atributy jmenného prostoru xml


Příznaky


Nelze ověřit podpis xml například pod třídou SignedXml.

<tns:CertificateStatusResponse xmlns="" xmlns:dpfunc="http://www.datapower.com/extensions/functions" 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>
< podpis xmlns = "http://www.w3.org/2000/09/xmldsig#" >
<SignedInfo>
< CanonicalizationMethod algoritmus = "http://www.w3.org/2001/10/xml-exc-c14n#" />
< SignatureMethod algoritmus = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
< URI odkazu = "#response" >
    <Transforms>
< transformační algoritmus = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
< transformační algoritmus = "http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
< DigestMethod algoritmus = "http://www.w3.org/2000/09/xmldsig#sha1" />
    <DigestValue>4hTmTRbInGChuyeqoRs06Tug30s=</DigestValue>
  </Reference>
</SignedInfo>
<SignatureValue>jHG4+lRvqs1g8ZRLCdND7lT7qFQr6YnzQ...</SignatureValue>
<KeyInfo>
 <X509Data>
   <X509Certificate>MIIEADCCAuigAwIBAgIFAMa3vBEwDQYJKoZIhvcNAQELB...</X509Certificate>
  </X509Data>
</KeyInfo>
</Signature>
</tns:CertificateStatusResponse>

Příčina


Při pokusu o ověření podpisu SignedXml.CheckSignature() canonicalizes informace SignedInfo uzlu a nesprávně zdědí atributy jmenného prostoru xml. V tomto případě xml:id přechází na informace SignedInfo, což by nemělo dojít a zruší platnost podpisu.

Řešení


V .NET 4.0 Tento stav lze napravit registrací vlastní transformace kanonikalizace algoritmus. Vlastní transformace delegátů vestavěné transformace Exc14N a odstraní atribut oboru názvů xml.

Třída vlastní transformace je velmi krátký a rovně vpřed.
veřejné třídy MyXmlDsigExcC14NTransform: XmlDsigExcC14NTransform
{
Public MyXmlDsigExcC14NTransform() {}

Přepsat public void LoadInput(Object obj)
   {           
XmlElement root = ((XmlDocument) obj). Prvek DocumentElement;
Pokud (kořen. Název "Informace SignedInfo" ==) kořen. RemoveAttribute("xml:id");
základ. LoadInput(obj);
   }
}

Na začátku aplikace mohou být registrovány MyXmlDsigExcC14NTransform s následující volání:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");

Při volání SignedXml.CheckSignature() MyXmlDsigExcC14NTransform se nazývá provádět interpretaci, která odstraní atribut xml:id.