J'ai essayé de faire en sorte que le support XMLDSIG dans .NET se comporte correctement, plus précisément la classe SignedXml. J'implémente un service tiers et ils ont récemment commencé à exiger que tous les messages doivent être signés numériquement ...SignedXml génère des signatures non valides
Mon problème est que, je n'arrive pas à générer des signatures valides. Le service tiers et un vérificateur de signature en ligne que j'ai trouvé signalent la signature comme invalide. Le service de vérification (http://www.aleksey.com/xmlsec/xmldsig-verifier.html) signale qu'il y a une discordance entre le résumé et les données, et jusqu'à présent j'ai été incapable de comprendre ce que je fais de mal.
Voici le code approprié - j'espère que quelqu'un pourra repérer mon erreur;
public static XDocument SignDocument(XDocument originalDocument, X509Certificate2 certificate)
{
var document = new XmlDocument();
document.LoadXml(originalDocument.ToString(SaveOptions.DisableFormatting));
if (document.DocumentElement == null)
throw new InvalidOperationException("Invalid XML document; no root element found.");
var signedDocument = new SignedXml(document);
Reference signatureReference = GetSignatureReference();
KeyInfo certificateKeyInfo = GetCertificateKeyInfo(certificate);
var dataObject = new DataObject("", "text/xml", "utf-8", document.DocumentElement);
signedDocument.AddReference(signatureReference);
signedDocument.AddObject(dataObject);
signedDocument.SigningKey = certificate.PrivateKey;
signedDocument.KeyInfo = certificateKeyInfo;
signedDocument.ComputeSignature();
return XDocument.Parse(signedDocument.GetXml().OuterXml, LoadOptions.PreserveWhitespace);
}
private static Reference GetSignatureReference()
{
var signatureReference = new Reference("");
signatureReference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
return signatureReference;
}
private static KeyInfo GetCertificateKeyInfo(X509Certificate certificate)
{
var certificateKeyInfo = new KeyInfo();
certificateKeyInfo.AddClause(new KeyInfoX509Data(certificate));
return certificateKeyInfo;
}
Great work! Je pense que votre article va m'aider beaucoup! J'ai besoin d'utiliser le type "enveloppé", et la documentation existante était horrible ... –
Merci beaucoup pour votre article! –
L'URL correcte est http://thomasjo.com/blog/2009/08/04/xmldsig-in-the-net-framework.html – Giorgi