Frage

Ich habe versucht, die XMLDSIG Unterstützung in .NET zu erhalten richtig zu verhalten, insbesondere die SignedXml Klasse. Ich bin einen Dritten Service Umsetzung und sie haben erst vor kurzem begonnen zu verlangen, dass alle Nachrichten digital signiert werden müssen ...

Mein Problem ist, dass, ich kann nicht gültige Signaturen zu erzeugen scheinen. Sowohl der Dritte Service und eine Online-Signaturprüfeinrichtung Ich fand, berichten die Signatur als ungültig. Der Prüfdienst ( http://www.aleksey.com/xmlsec/xmldsig-verifier.html ) berichtet, dass es eine Diskrepanz zwischen dem Digest und den Daten, und ich habe bisher nicht in der Lage gewesen, um herauszufinden, was ich falsch mache.

Hier ist der entsprechende Code - hoffentlich wird jemand in der Lage sein, meine Fehler zu erkennen;

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;
}
War es hilfreich?

Lösung

Falls jemand interessiert ist, löste ich das Problem und schrieb darüber in meinem Blog: http://thomasjo.com/blog/ 2009/08/04 / xmldsig-in-the-net-framework.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top