[ Foro de C# ]

Firma electronica

04-Apr-2025 10:05
Invitado (Xavi)
0 Respuestas

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));

 }




Si ya eres usuario del sistema, puedes contestar desde tu cuenta y así ganar prestigio.

Si sólo eres un visitante, puedes optar por...