XML-namnområdet attribut hanteras inte korrekt i SignedXml


Symptom


En XML-signatur som nedan kan inte verifieras av klassen 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>
< signatur xmlns = "http://www.w3.org/2000/09/xmldsig#" >
<SignedInfo>
< CanonicalizationMethod algoritm = "http://www.w3.org/2001/10/xml-exc-c14n#" />
< SignatureMethod algoritm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
< referens-URI = "#response" >
    <Transforms>
< Omforma Algorithm = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
< Omforma Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
< DigestMethod algoritm = "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>

Orsak


När SignedXml.CheckSignature() försöker verifiera signaturen canonicalizes noden SignedInfo och felaktigt ärver attribut för XML-namnområdet. I det här fallet ärvs xml:id till SignedInfo som inte ska hända och blir underskriften ogiltig.

Lösning


I .NET 4.0 kan detta åtgärdas genom att registrera en anpassad transformering för kanoniseringsalgoritm. Anpassad transformering delegerar till transformeringen inbyggda Exc14N och tar bort attributet XML-namnområde.

Klassen anpassad transformering är väldigt kort och rakt framåt.
allmän klass MyXmlDsigExcC14NTransform: XmlDsigExcC14NTransform
{
offentliga MyXmlDsigExcC14NTransform() {}

allmänheten åsidosätta void LoadInput(Object obj)
   {           
XmlElement rot = ((XmlDocument) obj). DocumentElement;
Om (rot. Namn == "SignedInfo") rot. RemoveAttribute("xml:id");
Base. LoadInput(obj);
   }
}

MyXmlDsigExcC14NTransform kan registreras med följande anrop i början av programmet:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");

När SignedXml.CheckSignature() anropas anropas MyXmlDsigExcC14NTransform för att utföra auktorisering som tar bort attributet xml:id.