SignedXml ne traite pas correctement les attributs d’espace de noms xml


Symptômes


Impossible de vérifier une signature xml tel que celui ci-dessous par la classe 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>
< signature xmlns = »http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
< algorithme de CanonicalizationMethod = »http://www.w3.org/2001/10/xml-exc-c14n# "/>
< SignatureMethod algorithme = »http://www.w3.org/2000/09/xmldsig#rsa-sha1 "/>
< URI de référence = « #response » >
    <Transforms>
< transformer l’algorithme = »http://www.w3.org/2000/09/xmldsig#enveloped-signature "/>
< transformer l’algorithme = »http://www.w3.org/2001/10/xml-exc-c14n# "/>
    </Transforms>
< DigestMethod algorithme = »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>

Cause


Lorsque SignedXml.CheckSignature() tente de vérifier la signature, il canonicalise le nœud SignedInfo et hérite de manière incorrecte les attributs d’espace de noms xml. Dans ce cas xml:id est héritée à SignedInfo qui ne devrait pas se produire et invalide la signature.

Résolution


Dans .NET 4.0, cela peut être résolu en enregistrant une transformation personnalisée pour l’algorithme de canonisation. La transformation personnalisée délègue à la transformation d’Exc14N intégrée et supprime l’attribut d’espace de noms xml.

La classe de transformation personnalisée est très court et simple.
classe publique MyXmlDsigExcC14NTransform : XmlDsigExcC14NTransform
{
public MyXmlDsigExcC14NTransform() {}

public override void LoadInput(Object obj)
   {           
XmlElement racine = (obj (XmlDocument)). DocumentElement ;
Si (racine. Nom == « SignedInfo ») racine. RemoveAttribute("xml:id") ;
base de. LoadInput(obj) ;
   }
}

Au début de votre application, MyXmlDsigExcC14NTransform peut être inscrit par l’appel suivant :
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");

Lorsque SignedXml.CheckSignature() est appelé, le MyXmlDsigExcC14NTransform est appelée pour effectuer la canonisation qui supprime l’attribut xml:id.