[ Foro de C# ]
Buenos dias
Haber si alguien me puede ayudar que llevo tiempo en ello y no me sale.
Tengo que firmar documentos xml por el tema de la factura electronica que obliga el gobierno.
En principio me la firma, pero al validarla en la pagina de la AEAT me dice que la firma es incorrecta.
Link Validacion https://face.gob.es/es/facturas/validar-visualizar-facturas
Os paso el codigo y haber si alguien ve algo que me dejo?. Gracias
-------------------------------------------------------------------------------------------------------------
private void Button8_Click(object sender, EventArgs e)
{
string archivoXml = Environment.CurrentDirectory + @"\\Archivo.xml";
string archivoPfx = Environment.CurrentDirectory + @"\\CERTIFICADO.pfx";
string contrasenaPfx = "XXXXXXXXXX";
string archivoFirmado = Environment.CurrentDirectory + @"\\firmada.xml";
// Cargar el certificado PFX
X509Certificate2 cert = new(archivoPfx, contrasenaPfx);
// Cargar el documento XML
XmlDocument xmlDoc = new();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(archivoXml);
// Firmar el XML
SignXml(xmlDoc, cert);
// Guardar el XML firmado
xmlDoc.Save(archivoFirmado);
Console.WriteLine("El documento XML ha sido firmado y guardado en: " + archivoFirmado);
}
private static void SignXml(XmlDocument xmlDoc, X509Certificate2 cert)
{
// Crear una nueva instancia de la clase SignedXml
SignedXml signedXml = new(xmlDoc);
// Asignar el certificado como clave de firma
signedXml.SigningKey = cert.GetRSAPrivateKey();
// Crear un objeto Reference para identificar el nodo que se firmará
Reference reference = new();
reference.Uri = ""; // Firmamos todo el documento
// Añadir transformaciones para asegurar que el contenido XML es tratado correctamente
XmlDsigEnvelopedSignatureTransform env = new();
reference.AddTransform(env);
// Añadir la referencia al objeto SignedXml
signedXml.AddReference(reference);
// Especificar el algoritmo de firma con SHA-256
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
// Crear el objeto KeyInfo
KeyInfo keyInfo = new();
keyInfo.AddClause(new KeyInfoX509Data(cert));
// Asignar el KeyInfo al objeto SignedXml
signedXml.KeyInfo = keyInfo;
// Firmar el XML
signedXml.ComputeSignature();
// Obtener la firma generada y añadirla al XML
XmlElement xmlSignature = signedXml.GetXml();
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlSignature, true));
}