2009-07-30 23 views
6

He intentado que el soporte XMLDSIG en .NET se comporte correctamente, más específicamente la clase SignedXml. Estoy implementando un servicio de terceros y recientemente han comenzado a requerir que todos los mensajes tengan que estar firmados digitalmente ...SignedXml genera firmas no válidas

Mi problema es que, parece 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 compendio y los datos, y hasta ahora no he podido averiguar qué estoy haciendo mal.

Aquí está el código relevante - con suerte alguien podrá 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; 
} 

Respuesta

12

En caso de que a alguien le interesa, he resuelto el problema y escribió sobre ello en mi blog: http://thomasjo.com/blog/2009/08/04/xmldsig-in-the-net-framework.html

+1

Gran trabajo! ¡Creo que su artículo me va a ayudar mucho! Necesito usar el tipo "envuelto", y la documentación existente era horrible ... –

+1

¡Muchas gracias por su artículo! –

+1

La URL correcta es http://thomasjo.com/blog/2009/08/04/xmldsig-in-the-net-framework.html – Giorgi

Cuestiones relacionadas