Comment signer un fichier XML avec une clé RSA .NET?

Je suis en train de signer un fichier XML en C# .NET 3.5 avec un privé RSA Clé générée par OpenSSL.

Voici comment j'ai procédé: j'ai converti la clé RSA de PEM format au format XML à l'aide de la chilkat cadre (www.example-code.com/csharp/cert_usePrivateKeyFromPEM.asp)

Avec mes clés XML, je suis maintenant en mesure d'utiliser natif .NET des Fonctions, que je préfère. J'ai donc utilisé les méthodes décrites sur MSDN.

Donc, à la fin, mon code source ressemble à ceci:

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();

//Load the private key from xml file
XmlDocument xmlPrivateKey = new XmlDocument();
xmlPrivateKey.Load("PrivateKey.xml");
rsaProvider.FromXmlString(xmlPrivateKey.InnerXml);

 //Create a SignedXml object.
 SignedXml signedXml = new SignedXml(Doc);

 //Add the key to the SignedXml document.
 signedXml.SigningKey = Key;

 //Create a reference to be signed.
 Reference reference = new Reference();
 reference.Uri = "";

 //Add an enveloped transformation to the reference.
 XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
 reference.AddTransform(env);

 //Add the reference to the SignedXml object.
 signedXml.AddReference(reference);

 //Compute the signature.
 signedXml.ComputeSignature();

 //Get the XML representation of the signature and save
 //it to an XmlElement object.
 XmlElement xmlDigitalSignature = signedXml.GetXml();

 //Append the element to the XML document.
 Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, true));

La signature XML-je obtenir avec cette fonction semble OK, j'ai un élément XML à la fin du fichier, comme il est censé être:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
  <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
  <Reference URI="">
    <Transforms>
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
    <DigestValue>qoGPSbe4oR9e2XKN6MzP+7XlXYI=</DigestValue>
  </Reference>
</SignedInfo>
<SignatureValue>iPQ6IET400CXfchWJcP22p2gK6RpEc9mkSgfoA94fL5UM6+AB5+IO6BbjsNt31q6MB8hR6lAIcnjzHzc5SeXvFP8Py2bqHTYJvcSA6KcKCQl1LiDNt12UwWiKpSkus2p0LdAeeZJNy9aDxjC/blUaZEr4uPFt0kGCD7h1NQM2SY=</SignatureValue>

Le problème est que quand j'ai essayer de vérifier la signature à l'aide de xmlsec à cette URL: http://www.aleksey.com/xmlsec/xmldsig-verifier.html. Je reçois un message me disant que la signature n'est pas valide.

J'ai été à la recherche de l'erreur dans mon code pour les jours et je ne peux pas savoir. Je commence à penser que la conversion du format PEM de fichier XML peut être le problème mais je ne sais pas comment tester cette. De plus, je n'ai pas trouvé d'autre moyen de les convertir à clé ou à utiliser directement le fichier PEM .NET.

Quelqu'un a réussi à obtenir une signature valide .NET?

OriginalL'auteur Nicolas Riou | 2009-12-01