J'essaie de signer un fichier XML en C# .NET 3.5 avec un RSA privé Clé générée par OpenSSL.Comment signer un fichier XML avec une clé RSA dans .NET?
Voici comment je continuai: Je me suis converti la clé RSA de PEM le format au format XML en utilisant le cadre chilkat (www.example-code.com/csharp/cert_usePrivateKeyFromPEM.asp)
Avec ma clé XML, je suis maintenant capable d'utiliser les fonctions .NET natives, que je préfère. J'ai donc utilisé les méthodes décrites sur MSDN.
Ainsi, à 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));
Le XML Signé je reçois avec cette fonction semble OK, j'ai l'é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 lorsque je tente de vérifier la signature en utilisant xmlsec à l'adresse suivante: http://www.aleksey.com/xmlsec/xmldsig-verifier.html. Je reçois un message me disant que la signature est invalide.
J'ai cherché l'erreur dans mon code pendant des jours et je ne peux pas trouver. Je commence à penser que la conversion de PEM en fichier XML pourrait être le problème mais je ne sais pas comment le tester. De plus, je n'ai trouvé aucun autre moyen de convertir en clé ou d'utiliser directement le fichier PEM dans .NET.
Est-ce que quelqu'un a réussi à obtenir une signature valide dans .NET?
Avec les « » vous signes implicites tous les XML si vous utilisez un identifiant vous signe que des pièces de il. –
La signature que je dois faire doit suivre la règle "Seul ce qui est vu doit être signé". J'ai supposé que je devais signer l'ensemble du document, mais j'ai peut-être tort ... Je vais essayer de changer le Uri de la référence. Espérons pleinement qu'il fera l'affaire. –
Comment définissez-vous l'ID de l'élément supérieur? J'ai essayé ceci: // Crée un objet de données pour contenir les données à signer. DataObject dataObject = new DataObject(); dataObject.Data = Doc.ChildNodes; dataObject.Id = "MyObjectId"; // Ajouter l'objet de données à la signature. signedXml.AddObject (dataObject); // Ajouter la clé au document SignedXml. signedXml.SigningKey = Clé; // Créer une référence à signer. Référence de référence = new Référence ("# MyObjectId"); Mais je reçois une exception ... –