/// /// Método utilizado para el firmado de XML con un certificado digital. /// /// XML a firmar. /// Ubicacion del certificacion digital /// Contraseña del certificado digital /// static XmlDocument Signed(XmlDocument xmlDoc, string pathCert, string passCert) { try { if (!File.Exists(pathCert)) throw new Exception("El certificado para firma no existe"); var cert = new X509Certificate2(pathCert, passCert, X509KeyStorageFlags.Exportable); var exportedKeyMaterial = cert.PrivateKey.ToXmlString(true); var key = new RSACryptoServiceProvider(new CspParameters(24)); key.PersistKeyInCsp = false; key.FromXmlString(exportedKeyMaterial); SignedXml signedXml = new SignedXml(xmlDoc); signedXml.SigningKey = key; signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; // Se agrega la referencia del algoritmo de firma utilizado. Reference reference = new Reference(); reference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); reference.DigestMethod = "http://www.w3.org/2001/04/xmlenc#sha256"; reference.Uri = ""; signedXml.AddReference(reference); // Se agrega la información del certificado utilizado para la firma. KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(cert)); signedXml.KeyInfo = keyInfo; // Generate the signature. signedXml.ComputeSignature(); //Obtenemos la representación del XML firmado y la guardamos en un XmlElement object XmlElement xmlFirmaDigital = signedXml.GetXml(); //Adicionamos el elemento de la firma al documento XML. xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlFirmaDigital, true)); return xmlDoc; } catch (Exception ex) { throw ex; } }