///
/// 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;
}
}