/// <summary>
/// Método utilizado para el firmado de XML con un certificado digital.
/// </summary>
/// <param name="xmlDoc">XML a firmar.</param>
/// <param name="pathCert">Ubicacion del certificacion digital</param>
/// <param name="passCert">Contraseña del certificado digital</param>
/// <returns></returns>
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;
 }
}