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
Vous devez vous connecter pour publier un commentaire.
Oui, j'ai réussi à le faire.
Je pense que le problème est avec votre référence. L'uri doit pointer vers l'id de l'élément que la signature est pour. De toute façon, vérifier le code ci-dessous, j'espère qu'elle vous mène dans la bonne direction.
/Klaus
La signature que j'ai à faire doit suivre la règle "que ce qui est vu, devrait être signé". J'ai supposé que je devais signer le document en entier, mais j'ai peut-était mal... je vais essayer donc de modifier l'Uri de la référence. Espérons entièrement il fera l'affaire.
Comment pouvez-vous définir l'Id de l'élément de plus haut niveau ? J'ai essayé ceci : // création d'un objet de données pour stocker les données à signer. DataObject dataObject = new DataObject(); dataObject.Données = Doc.ChildNodes; dataObject.Id = "MyObjectId"; // Ajout de l'objet de données pour la signature. signedXml.AddObject(dataObject); // Ajouter la clé de la SignedXml document. signedXml.SigningKey = Key; // Créer une référence à être signé. Référence = Référence("#MyObjectId"); Mais je suis une exception ...
OriginalL'auteur Klaus Byskov Pedersen
Il me semble que vous vous connectez le everrything dans le xml:
reference.Uri = "";
Purhaps vous casser la signature lorsque vous l'insérez dans le document ou l'insérer dans un mauvais sens.
Également être au courant des espaces de noms et les espaces certains de il est également signé, ce qui peut causer des problèmes plus tard, lorsque l'on travaille sur le document signé.
OriginalL'auteur Henrik Gering
Essayer de remplacer
:
OriginalL'auteur henningc
Je vais avoir le même problème aujourd'hui, un de mes co-travailleur de la soupçonne que c'est peut-être parce que .net xml C14 transformer ne suit pas la norme XML qui est mis en œuvre dans xmlsec. Je vais essayer de faire la transformation sur mon propre et laissez-vous savoir si c'est vraiment la question.
OriginalL'auteur ColdEar
J'ai eu le même problème lors de la vérification de la signature XML avec XML-Signataire. Il a obtenu résolu quand j'ai ajouté:
doc.PreserveWhitespace = False
avant de charger le Document XML à être signé
Un bon exemple peut être trouvé ici:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.signature(v=vs. 110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2
OriginalL'auteur xyzcoucou