J'ai un fichier XML qui ressemble à ceciRéduire au minimum les informations dans un segment de signature à l'aide RSACryptoServiceProvider
<Licence>
<Name>Test company</Name>
<Version>1.1.1.1</Version>
<NumberOfServer>2</NumberOfServer>
</Licence>
J'utilise ensuite une clé privée générée précédente pour signer le fichier XML en utilisant le code foloowing
private void SignFile(XmlDocument doc)
{
SignedXml signedXml = new SignedXml(doc2);
_cryptoServiceProvider.FromXmlString(XmlDocument.Load("private.key").Root.ToString());
signedXml.SigningKey = _cryptoServiceProvider;
Signature XMLSignature = signedXml.Signature;
Reference reference = new Reference("");
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
XMLSignature.SignedInfo.AddReference(reference);
signedXml.ComputeSignature();
XmlElement xmlDigitalSignature = signedXml.GetXml();
doc.DocumentElement.AppendChild(doc2.ImportNode(xmlDigitalSignature, true));
doc.Save("signed.xml");
}
Je reçois un fichier qui ressemble à ceci et qui valide avec la clé publique!
<Licence>
<Name>Test company</Name>
<Version>1.1.1.1</Version>
<NumberOfServer>2</NumberOfServer>
<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>tmGyr97mgGDviRpzcWjpMdNNMSI=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Vc5R/OWiup4Rv7+1Tu8Ino83P0mh6npLkNYEaq0QVa6j+OvISOPERO57EllCQWdB1Lgjc7B+lmV4JiSvdfovkldhNZb4+iFgdrI+qOdSEIsBk/KhGS93PfekhDd3qirGerpeGbLAEqZ36jT0aT/QruZXpOX6Y6H5fqGj4prUZaM=</SignatureValue>
</Signature>
</Licence>
MAIS dois-je avoir le champ SignedInfo là-bas et comment puis-je me débarrasser?
J'utilise quelque chose comme ça pour valider.
_cryptoServiceProvider.FromXmlString(XDocument.Load("public.key").Root.ToString());
XmlDocument doc = new XmlDocument();
doc.Load("signed.xml");
SignedXml signedXml = new SignedXml(doc);
XmlNodeList nodeList = doc.GetElementsByTagName("Signature");
signedXml.LoadXml((XmlElement)nodeList[0]);
bool valid = signedXml.CheckSignature(_cryptoServiceProvider);
OK. Je pensais bien mais je me suis convaincu que c'était plus facile. Merci. Bonne réponse. – Riri