SignedXml δεν χειρίζεται σωστά τα χαρακτηριστικά χώρου ονομάτων xml


Συμπτώματα


Μια υπογραφή xml όπως κάτω από αυτό δεν μπορεί να επαληθευτεί από την κλάση 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>
< υπογραφή xmlns = "http://www.w3.org/2000/09/xmldsig#" >
<SignedInfo>
< αλγόριθμος CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#" />
< αλγόριθμος SignatureMethod = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
< URI αναφοράς = "#response" >
    <Transforms>
< μετασχηματισμός αλγόριθμος = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
< μετασχηματισμός αλγόριθμος = "http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
< αλγόριθμος DigestMethod = "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>

Αιτία


Όταν SignedXml.CheckSignature() προσπαθεί να επιβεβαιώσει την υπογραφή canonicalizes στον κόμβο SignedInfo και μεταβιβάζονται εσφαλμένα χαρακτηριστικά χώρο ονομάτων xml. Σε αυτήν την περίπτωση xml:id μεταβιβάζεται σε SignedInfo που δεν πρέπει να συμβεί και ακυρώνει την υπογραφή.

Προτεινόμενη αντιμετώπιση


Στο .NET 4.0, αυτό μπορεί να διορθωθεί με την καταχώρηση ενός προσαρμοσμένου μετασχηματισμού για τον αλγόριθμο κανονικοποίησης. Ο προσαρμοσμένος μετασχηματισμός αναθέτει στο ενσωματωμένο μετασχηματισμό Exc14N και αφαιρεί το χαρακτηριστικό χώρου ονομάτων xml.

Η κλάση προσαρμοσμένου μετασχηματισμού είναι πολύ μικρό και σαφή.
δημόσια κλάσης MyXmlDsigExcC14NTransform: XmlDsigExcC14NTransform
{
δημόσια MyXmlDsigExcC14NTransform() {}

κοινό παράκαμψη void LoadInput(Object obj)
   {           
Ρίζα XmlElement = (obj (XmlDocument)). DocumentElement-
Εάν (ρίζα. Όνομα == "SignedInfo") ρίζας. RemoveAttribute("xml:id")-
βάση. LoadInput(obj)-
   }
}

Στην αρχή της εφαρμογής σας MyXmlDsigExcC14NTransform μπορεί να καταχωρηθεί με την παρακάτω κλήση:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");

Όταν καλείται το SignedXml.CheckSignature(), MyXmlDsigExcC14NTransform καλείται να πραγματοποιήσει η κανονικοποίηση που αφαιρεί το χαρακτηριστικό xml:id.