47 lines
1.8 KiB
Plaintext
47 lines
1.8 KiB
Plaintext
/// <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;
|
|
}
|
|
} |