Pregunta

He estado intentando que la compatibilidad con XMLDSIG en .NET se comporte correctamente, más específicamente la clase SignedXml. Estoy implementando un servicio de terceros y recientemente comenzaron a exigir que todos los mensajes tengan que estar firmados digitalmente ...

Mi problema es que no puedo generar firmas válidas. Tanto el servicio de terceros como el verificador de firmas en línea que encontré, informan que la firma no es válida. El servicio de verificación ( http://www.aleksey.com/xmlsec/xmldsig-verifier.html ) informa que hay una discrepancia entre el resumen y los datos, y hasta ahora no he podido averiguar qué estoy haciendo mal.

Aquí está el código relevante: espero que alguien pueda detectar mi error;

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;
}
¿Fue útil?

Solución

En caso de que alguien esté interesado, resolví el problema y lo escribí en mi blog: http://thomasjo.com/blog/ 2009/08/04 / xmldsig-in-the-net-framework.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top