/// <summary> /// Obtiene la informacion del certificado /// </summary> /// <param name="rutaArvhivoCertificado"></param> /// <param name="xml"></param> private static void obtenerCertificado(string rutaArchivoCertificado, ref XDocument xml) { try { Cert certificado = new Cert(); if (certificado.LoadFromFile(rutaArchivoCertificado) == false) { return; } if (certificado.Expired == true) { return; } string serie = certificado.SerialNumber; string noCertificado = string.Empty; for (int i = 0; i < serie.Length; i++) { if (i % 2 != 0) { noCertificado += serie.ElementAt(i); } } serie = noCertificado; xml.Root.SetAttributeValue("NoCertificado", noCertificado); xml.Root.SetAttributeValue("Certificado", certificado.GetEncoded()); } catch (Exception ex) { throw ex; } }
public CfdiResult AgregarCertificado(String rutaCert) { Cert cert = new Cert(); if (!cert.LoadFromFile(rutaCert)) { return new CfdiResult() { Mensaje = cert.LastErrorText, Correcto = false } } ; if (cert.Expired) { return new CfdiResult() { Mensaje = "Certificado expirado", Correcto = false } } ; String serie = cert.SerialNumber; String noCertificado = ""; for (int i = 1; i < serie.Length; i += 2) { noCertificado += serie[i]; } this.Certificado = cert.GetEncoded().Replace(Environment.NewLine, ""); this.NoCertificado = noCertificado; return(new CfdiResult()); }
public CfdiResult SellarXml(String rutaCert, String rutaKey, String contrasena, String rutaArchivoXmlOrigen) { CfdiResult result = AgregarCertificado(rutaCert); if (!result.Correcto) { return(result); } PrivateKey privKey = new PrivateKey(); XDocument xDoc = XDocument.Load(rutaArchivoXmlOrigen); xDoc.Root.SetAttributeValue("Certificado", this.Certificado); xDoc.Root.SetAttributeValue("NoCertificado", this.NoCertificado); xDoc.Save(rutaArchivoXmlOrigen); String cadenaOriginal = GetCadenaOriginal(this.RutaXSLTCadenaOriginal, rutaArchivoXmlOrigen); if (!privKey.LoadPkcs8EncryptedFile(rutaKey, contrasena)) { return(new CfdiResult(false, privKey.LastErrorText)); } String privKeyXml = privKey.GetXml(); Rsa rsa = new Rsa(); String hashAlg = "SHA-256"; if (!rsa.UnlockComponent("RSAT34MB34N_7F1CD986683M")) { return(new CfdiResult(false, rsa.LastErrorText)); } if (!rsa.ImportPrivateKey(privKeyXml)) { return(new CfdiResult(false, rsa.LastErrorText)); } rsa.Charset = "UTF-8"; rsa.EncodingMode = "base64"; rsa.LittleEndian = false; Cert cert = new Cert(); if (!cert.LoadFromFile(rutaCert)) { return(new CfdiResult(false, cert.LastErrorText)); } String selloBase64 = rsa.SignStringENC(cadenaOriginal, hashAlg); PublicKey publicKey = cert.ExportPublicKey(); Rsa rsa2 = new Rsa(); if (!rsa2.ImportPublicKey(publicKey.GetXml())) { return(new CfdiResult(false, rsa2.LastErrorText)); } rsa2.Charset = "utf-8"; rsa2.EncodingMode = "base64"; rsa2.LittleEndian = false; if (!rsa2.VerifyStringENC(cadenaOriginal, hashAlg, selloBase64)) { return(new CfdiResult(false, rsa2.LastErrorText)); } cert.Dispose(); privKey.Dispose(); publicKey.Dispose(); this.Sello = selloBase64; xDoc.Root.SetAttributeValue("Sello", selloBase64); //String xml = xDoc.ToString(); //File.WriteAllText(rutaArchivoXmlOrigen, xml); xDoc.Save(rutaArchivoXmlOrigen); //SerializarObjeto(rutaArchivoXmlOrigen); return(new CfdiResult()); }
/// <summary> /// Obtiene la informnacion del certificado, lo desencripta y aplica digestion SHA-256 para generar el sello. /// </summary> /// <param name="cfdi"></param> /// <param name="xml"></param> private static void firmarXml(Cfdi cfdi, ref XDocument xml) { try { obtenerCertificado(cfdi.rutaArchivoCer, ref xml); string cadenaOriginal = obtenerCadenaOriginal(cfdi.rutaXsltCadenaOriginal, xml); string algoritmoHash = "SHA-256"; string xmlLlavePrivada = string.Empty; string sellobase64 = string.Empty; Rsa rsa = new Rsa(); Rsa rsa2 = new Rsa(); Cert certificado = new Cert(); PrivateKey llavePrivada = new PrivateKey(); Chilkat.PublicKey llavePublica; if (llavePrivada.LoadPkcs8EncryptedFile(cfdi.rutaArchivoKey, cfdi.secretArchivoKey) == false) { return; } xmlLlavePrivada = llavePrivada.GetXml(); if (rsa.UnlockComponent(Constantes.CHILKAT_UNLOCK_CODE) == false) { //Debug.Write(rsa.LastErrorText); return; } if (rsa.ImportPrivateKey(xmlLlavePrivada) == false) { //Debug.Write(rsa.LastErrorText); return; } rsa.Charset = "utf-8"; rsa.EncodingMode = "base64"; rsa.LittleEndian = false; if (certificado.LoadFromFile(cfdi.rutaArchivoCer) == false) { return; } sellobase64 = rsa.SignStringENC(cadenaOriginal, algoritmoHash); xml.Root.SetAttributeValue("Sello", sellobase64); XElement xComprobante = xml.Root; xComprobante = HelpersXml.removerAtributosVacios(xml.Root, true); llavePublica = certificado.ExportPublicKey(); if (rsa2.ImportPublicKey(llavePublica.GetXml()) == false) { return; } rsa2.Charset = "utf-8"; rsa.EncodingMode = "base64"; rsa2.LittleEndian = false; if (rsa2.VerifyStringENC(cadenaOriginal, algoritmoHash, sellobase64) == false) { return; } certificado.Dispose(); cfdi.cadenaOriginal = cadenaOriginal; } catch (Exception ex) { throw ex; } }