martes, diciembre 17, 2013

Firma Electronica XML Banco Central del Ecuador BCE

Saludos en esta entrada publicare como firmar un archivo XML con la firma electrónica en archivo p12 proveída por el Banco Central del Ecuador.

Esta firma es la mas barata del mercado.

En formato:

Extención .p12
Estándar: X.509
Algoritmo: RSA-SHA1

Podre disponible para los lenguajes de programación Java y C#.

Java (Probado con el JDK de oracle):

1. Lo que tenemos que hacer es bajarnos las bibliotecas recomendadas inclusive en la documentacion del SRI.

Ingresamos a:

http://oficinavirtual.mityc.es/componentes/

Luego en descagas:

http://oficinavirtual.mityc.es/componentes/downloads.html

Nos bajamos los componentes incluyendo las dependencias.

componentes-1.1.7-with-deps.zip (Version al momento de escribir esta entrada).

2. Agregamos las referencias al proyecto donde estamos desarrollando. Preferiblemente incluir todas y las librerias de la firma.

Los jasrs estan dentro de la caperpeta deps y core.

3. De acuerdo a la documentacion debemos crear una clase que sirva como clase generica para la firma y una clase especifiquemos las lineas de codigo para nuestro tipo de firma.

En la documentacion del SRI explica que debemos usar el tipo de firma XAdES_BES. Por lo que la segunda clase nos ayudara para espicificar esto.

Clase FirmaGenerica (Clase abstracta como se muestra en la documentacion):

public abstract class GenericXMLSignature {


    //Path de la firma electronica
    private String pathSignature;
    //calve de la firma electronica
    private String passSignature;
    
    /**
    *
    * Ejecución del ejemplo. La ejecución consistirá en la firma de los datos
    * creados por el método abstracto createDataToSign mediante el
    * certificado declarado en la constante PKCS12_FILE. El
    * resultado del proceso de firma será almacenado en un fichero XML en el
    * directorio correspondiente a la constante OUTPUT_DIRECTORY
    * del usuario bajo el nombre devuelto por el método abstracto
    * getSignFileName
    *

    */
  
    /*Metodos Getters y Setters (Propiedades)*/
    public String getPathSignature() {
        return pathSignature;
    }

    public void setPathSignature(String pathSignature) {
        this.pathSignature = pathSignature;
    }

    public String getPassSignature() {
        return passSignature;
    }

    public void setPassSignature(String passSignature) {
        this.passSignature = passSignature;
    }
  
    protected void execute() {
    
        // Obtencion del gestor de claves
        KeyStore keyStore = getKeyStore();
      
        if(keyStore==null){
            System.err.println("No se pudo obtener almacen de firma.");
            return;
        }
        String alias=getAlias(keyStore);
      
        // Obtencion del certificado para firmar. Utilizaremos el primer
        // certificado del almacen.          
        X509Certificate certificate = null;
        try {
            certificate = (X509Certificate)keyStore.getCertificate(alias);
            if (certificate == null) {
                System.err.println("No existe ningún certificado para firmar.");
                return;
            }
        } catch (KeyStoreException e1) {
            e1.printStackTrace();
        }
    
        // Obtención de la clave privada asociada al certificado
        PrivateKey privateKey = null;
        KeyStore tmpKs = keyStore;
        try {
            privateKey = (PrivateKey) tmpKs.getKey(alias, this.passSignature.toCharArray());
        } catch (UnrecoverableKeyException e) {
            System.err.println("No existe clave privada para firmar.");
            e.printStackTrace();
        } catch (KeyStoreException e) {
            System.err.println("No existe clave privada para firmar.");
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            System.err.println("No existe clave privada para firmar.");
            e.printStackTrace();
        }
    
         // Obtención del provider encargado de las labores criptográficas
         Provider provider = keyStore.getProvider();

         /*
          * Creación del objeto que contiene tanto los datos a firmar como la
          * configuración del tipo de firma
          */
         DataToSign dataToSign = createDataToSign();

         /*
          * Creación del objeto encargado de realizar la firma
          */
         FirmaXML firma = new FirmaXML();

         // Firmamos el documento
         Document docSigned = null;
         try {
             Object[] res = firma.signFile(certificate, dataToSign, privateKey, provider);
             docSigned = (Document) res[0];
         } catch (Exception ex) {
             System.err.println("Error realizando la firma");
             ex.printStackTrace();
             return;
         }

         // Guardamos la firma a un fichero en el home del usuario
         String filePath = getPathOut() + File.separatorChar + getSignatureFileName();
         System.out.println("Firma salvada en en: " + filePath);
       
         saveDocumenteDisk(docSigned, filePath);
    }
    
     /**
      *
      * Crea el objeto DataToSign que contiene toda la información de la firma
      * que se desea realizar. Todas las implementaciones deberán proporcionar
      * una implementación de este método
      *

      *
     * @return El objeto DataToSign que contiene toda la información de la firma
      *         a realizar
      */
    protected abstract DataToSign createDataToSign();

    
    protected abstract String getSignatureFileName();
  
    protected abstract String getPathOut();
   

  
     protected Document getDocument(String resource) {
         Document doc = null;
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         dbf.setNamespaceAware(true);
         File file = new File(resource);
         try {
            DocumentBuilder db = dbf.newDocumentBuilder();
          
            doc=db.parse(file);
         } catch (ParserConfigurationException ex) {
             System.err.println("Error al parsear el documento");
             ex.printStackTrace();
             System.exit(-1);
         } catch (SAXException ex) {
             System.err.println("Error al parsear el documento");
             ex.printStackTrace();
             System.exit(-1);
         } catch (IOException ex) {
             System.err.println("Error al parsear el documento");
             ex.printStackTrace();
             System.exit(-1);
         } catch (IllegalArgumentException ex) {
            System.err.println("Error al parsear el documento");
             ex.printStackTrace();
            System.exit(-1);
         }
         return doc;
     }

   
     private KeyStore getKeyStore()
     {
         KeyStore ks = null;
        try {
            ks = KeyStore.getInstance("PKCS12");
            ks.load(new FileInputStream(pathSignature), passSignature.toCharArray());
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
         return ks;
     }
   
   

     private static String getAlias(KeyStore keyStore)
     {
         String alias = null;
         Enumeration nombres;
           try {
               nombres = keyStore.aliases();
                 
               while(nombres.hasMoreElements())
               {
                   String tmpAlias = (String)nombres.nextElement();
                   if(keyStore.isKeyEntry(tmpAlias))
                   alias=tmpAlias;
               }
           }
           catch (KeyStoreException e) {
               e.printStackTrace();
           }
           return alias;
     }






   

 public static void saveDocumenteDisk(Document document,String pathXml)
     {
         try {
                 DOMSource source = new DOMSource(document);
                 StreamResult result = new StreamResult(new File(pathXml));

                 TransformerFactory transformerFactory = TransformerFactory.newInstance();
                 Transformer transformer;
                 transformer = transformerFactory.newTransformer();
                 transformer.transform(source, result);
         } catch (TransformerConfigurationException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
         } catch (TransformerException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
         }
     }
}


////Esta es la clase que extiende de Generic.
public class XAdESBESSignature extends GenericXMLSignature{


   
        private static String nameFile;
        private static String pathFile;
        /**
        *
        * Recurso a firmar
        *

        */
        private String fileToSign;
         
        /**
        *
        * Fichero donde se desea guardar la firma
        *

        */
        public XAdESBESSignature(String fileToSign) {
            super();
            this.fileToSign = fileToSign;
        }

        /**
           *
           * Punto de entrada al programa
           *

           *
           * @param args
           *            Argumentos del programa
           */
     

        public static void firmar(String xmlPath,String pathSignature,String passSignature,String pathOut,String nameFileOut)
        {           
              //Document document=UtilApplication.convertStringToDocument(xml);

              //String pathXml=UtilApplication.getTempPath()+"\\"+UUID.randomUUID().toString()+".xml";

              //UtilApplication.saveDocumenteDisk(document, pathXml);

           
           
              XAdESBESSignature signature = new XAdESBESSignature(xmlPath);
              signature.setPassSignature(passSignature);
              signature.setPathSignature(pathSignature);
              pathFile=pathOut;
              nameFile=nameFileOut;
             
              signature.execute();
          }
         
         
          @Override
          protected DataToSign createDataToSign() {
             
              DataToSign datosAFirmar = new DataToSign();

              datosAFirmar.setXadesFormat(es.mityc.javasign.EnumFormatoFirma.XAdES_BES);
              
              datosAFirmar.setEsquema(XAdESSchemas.XAdES_132);
              datosAFirmar.setXMLEncoding("UTF-8");
              datosAFirmar.setEnveloped(true);
              datosAFirmar.addObject(new ObjectToSign(new InternObjectToSign("comprobante"), "contenido comprobante", null, "text/xml", null));
              datosAFirmar.setParentSignNode("comprobante");

              Document docToSign = getDocument(fileToSign);
              datosAFirmar.setDocument(docToSign);

              return datosAFirmar;
          }
     

        @Override
        protected String getSignatureFileName() {
            return XAdESBESSignature.nameFile;
        }
       
        @Override
        protected String getPathOut() {
            return XAdESBESSignature.pathFile;
        }
   
}

//Como usar dicha clase

XAdESBESSignature.firmar(String xmlPath,String pathFirma,String clavefirma,String directoriosalida, String nombreArchivoSalida);

//Hasta aqui la firma.

Los jars de referencias y necesarios son:
bcmail-jdk16-1.45.jar
bcprov-jdk16-1.45.jar
bctsp-jdk16-1.45.jar
commons-codec-1.8.jar
commons-httpclient-3.0.1.jar
commons-lang-2.4.jar
commons-logging-1.1.3.jar
DNIeJCAProvider-1.4.jar
iaikPkcs11Wrapper-1.1.7.jar
jss-4.2.5.jar
MITyCLibAPI-1.1.7.jar
MITyCLibCert-1.1.7.jar
MITyCLibOCSP-1.1.7.jar
MITyCLibTrust-1.1.7.jar
MITyCLibTSA-1.1.7.jar
MITyCLibXADES-1.1.7.jar
serializer-2.7.1.jar
sunpkcs11-1.0.jar
xalan-2.7.1.jar
xml-apis-1.3.04.jar
xmlsec-1.4.2-ADSI-1.1.jar
xmlsec-1.5.5.jar


///Para c# al momento lo que he logrado es esto por cuestiones de tiempo no he logrado terminar si alguien tiene terminao hagamelo saber.

public class Signature
    {

        Random rnd = new Random(DateTime.Now.
Millisecond);

        public const string XmlDsigRSASHA1Url = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";

        public void Xml(String pathXml,String pathSignature,String passFirma)
        {
            //Declaro variable XMLDocument
            XmlDocument xmlDoc = new XmlDocument();
            // Cargo el documento en el xmlDoc
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load(pathXml);

            //Obtengo la firma en el Certificado X509
            X509Certificate2 uidCert = new X509Certificate2(pathSignature, passFirma, X509KeyStorageFlags.DefaultKeySet);

            //Inicializo el RSA
            RSACryptoServiceProvider rsaKey = (RSACryptoServiceProvider)uidCert.PrivateKey;

            //Agrego el SgnedXml que permite firmar el xml
            SignedXml signedXml = new SignedXml(xmlDoc);

            // Add the key to the SignedXml document.
            signedXml.SigningKey = rsaKey;

            //signedXml.Signature.Id = newID("Signature");
           

            //Agregamos el metodo de firmado
            signedXml.SignedInfo.SignatureMethod = XmlDsigRSASHA1Url;

            //signedXml.SignedInfo.Id = newID("Signature-SignedInfo");

            // Create a reference to be signed.
            Reference reference = new Reference();
            //reference.Id = newID("SignedPropertiesID");
            reference.Uri = "";

            // Add an enveloped transformation to the reference.
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);

            // Add the reference to the SignedXml object.
            signedXml.AddReference(reference);


            // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
            KeyInfo keyInfo = new KeyInfo();

            KeyInfoX509Data clause = new KeyInfoX509Data();
            clause.AddSubjectName(uidCert.Subject);
            clause.AddCertificate(uidCert);
            keyInfo.AddClause(clause);

            //keyInfo.Id = newID("Certificate1");

            signedXml.KeyInfo = keyInfo;

            // Compute the signature.
            signedXml.ComputeSignature();


            Boolean respuesta = signedXml.CheckSignature();
            System.Console.WriteLine(respuesta);

            // Get the XML representation of the signature and save
            // it to an XmlElement object.
            XmlElement xmlDigitalSignature = signedXml.GetXml();


            //XmlElement signature = signedXml.GetXml();
            foreach (XmlNode node in xmlDigitalSignature.SelectNodes(
                "descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']"))
            {
                node.Prefix = "ds";
            }


            System.Console.WriteLine(signedXml.GetXml().InnerXml);
            // Append the element to the XML document.
            xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));

            xmlDoc.Save(@"D:\Xml\firmado.xml");

        }


        private String newID(String prefix)
        {
            String newID = prefix + rnd.Next(1048576);
            newID = prefix + rnd.Next(1048576);
            return newID;
        }
    }


A mis amigos de los diferentes lenguajes que no sean java les recomiendo tratar de consumir los webservices del por medio de soap.  Existe un software llamado SOAPUI. que permite o muestra como se consume en webservice. http://sourceforge.net/projects/soapui/files/

En .net he tenido problemas si se agrega como referencia no se porque no llena los objetos de retorno cuando se consume.

Es mi experiencia si alguie lo tiene no dude en compartir.


Disculpas no puedo subir proyectos por la sutacion comercial que puedan dar al mismo mi intencion es dar directrices que lo puedan lograr.

Por favor si algo no funciona sean mas especificos. error exacto.

Mas información (Comercial): http://www.corvustec.com/index.php?option=com_content&view=article&id=58&Itemid=87

125 comentarios:

Héctor López dijo...

Saludos, tengo un archivo .p12 de firma electrónica generada del banco central de ecuador, también tengo generado un archivo xml donde están los datos de una factura, quisiera saber como añado esa firma electrónica al xml..!!!

joel dijo...

hola saludos tienes los fuentes del envió del XML por el servicio web

Luis Sancho Sánchez dijo...

Hector, en la pagina http://oficinavirtual.mityc.es/componentes/ hay ejemplos de firmas e incluso las mismas se pueden utilizar para c# y funcionan bien...

Saludos

Freddy V dijo...

Tengo un problema al emviar el XML al SRI por el servicio WEB, puedes ayudarme o indicarme donde puedo conseguir mejor informacion. Tengo la guia tecnica pero no es muy clara en este capitulo
Gracias

Paul dijo...

Gracias amigo, he estado ocupado en otros proyectos, en este momento voy a ver los links que pusiste y probar eso de la firma..!!!
muchas gracia por su ayuda

Unknown dijo...

porfa me gustaria ver la continuación del código ya que estoy haciendo un proyecto que tiene que ver con eso en mi tesis de grado

LuisAn dijo...

Que tal me gustaria saber el codigo para vb. net esty desarrollando un proyecto y me esta faltando ese detalle

LuisAn dijo...

Que tal me gustaria saber el codigo para vb. net esty desarrollando un proyecto y me esta faltando ese detalle

Alex Moya dijo...

Hola. Ya tienes la clase para .net?

Unknown dijo...

Hola amigo, yo estoy haciendo el proyecto en Java, pero sigo todos tus pasos, pero no puedo ejecutar mi archivo EnvelopedSignature.xml, por las dependencias he agregado tooodas las librerias, no se si sera mucho pedir que subas un link de un proyecto en java realizando la firma de un xml, con todas las librerias necesarias, muchas gracias espero puedas apoyarnos con eso

Unknown dijo...

Hola amigo, yo estoy haciendo el proyecto en Java, pero sigo todos tus pasos, pero no puedo ejecutar mi archivo EnvelopedSignature.xml, por las dependencias he agregado tooodas las librerias, no se si sera mucho pedir que subas un link de un proyecto en java realizando la firma de un xml, con todas las librerias necesarias, muchas gracias espero puedas apoyarnos con eso

Unknown dijo...

Hola amigo, yo estoy haciendo el proyecto en Java, pero sigo todos tus pasos, pero no puedo ejecutar mi archivo EnvelopedSignature.xml, por las dependencias he agregado tooodas las librerias, no se si sera mucho pedir que subas un link de un proyecto en java realizando la firma de un xml, con todas las librerias necesarias, muchas gracias espero puedas apoyarnos con eso

Anónimo dijo...

Hola alguien sabe como funciona el envio del archivo XML al web service del sri, solamente me responde que los parámetros no son correctos lo estoy haciendo en Visual FoxPro, de pronto hay que configurar algo adicional.
Gracias de antemano.

Paul dijo...

Ante todo gracias por la aportación.
Disculpen saben como agregar un nombre al URI, me sale así

ds:Reference Id="Reference-ID-200615" URI=""

pero necesito poner asi URI="#comprobante"

Vinfer dijo...

Muy buena la ayuda estimado amigo. Una pregunta quiero hacerle.. Como hago para leer la firma mediante un TOken usb?, como cambia la lectura.?.. Espero pueda ayudarme.

Saludos cordiales

Unknown dijo...

mediante token usb, lo intente pero es casi imposible por lo que no deja importar el certificado con la clave privada que es lo que se encripta al momentos de firmar los xml

Unknown dijo...

Buen dia a todos, copie el código que expuso Fernando, ya me firmo el documento, lo envio al SRI con el resultado RECIBIDA, pero al ver el documento si esta autorizado me sale FIRMA INVALIDA o algo así. Alguien que haya resuelto lo de la firma, ya sea en JAVA (NetBeans) o .NET c#? Ahí podemos compartir código.

Anónimo dijo...

Como están? una petición alguien me podría guiar en la conversión de los .jar a .dll, trate con ikvmc pero me arroja errores y advertencias ademas de que no puede escribir en la carpeta destino.

Saludos.
J. Desarrollo

Unknown dijo...

Te funciono la firma? podrias ayudarme con ese código? Yo trabajo con .NET c# y estoy llamando a ese .JAR desde de este aplicativo, no genero la DLL de java.

Unknown dijo...

tienes qe utilizar Dim xml As Byte() = File.ReadAllBytes(txt_ruta_xml.Text.Trim).
Hay se soluciona el error de firma invalida

Unknown dijo...

Muy buen aporte amigo, no se de que manera sería posible firmar con un certificado almacenado en un token.. he tratado pero no he podido hasta el momento...

Unknown dijo...

Les quería aportar algo que he conseguido hasta ahora en C#, y es en el caso que no tengamos el archivo .p12, recién lo conseguí y no se hasta que punto funcione.

//Obtengo la firma en el Certificado X509
X509Certificate2 uidCert;
if (pathSignature == "")
{
uidCert = loadFromStore();
}
else
{
uidCert = new X509Certificate2(pathSignature, passFirma, X509KeyStorageFlags.DefaultKeySet);
}
private X509Certificate2 loadFromStore()
{
X509Store objStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
X509Certificate2 certif = new X509Certificate2();
List certificados = new List();
objStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = (X509Certificate2Collection)objStore.Certificates;
X509Certificate2Collection findCollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
X509Certificate2Collection selectCollection = X509Certificate2UI.SelectFromCollection(findCollection
, "Test Certificate Select"
, "Select a particular certificate from the following list to get information on that certificate"
, X509SelectionFlag.MultiSelection);
certificados.AddRange(objStore.Certificates.Cast().ToList());
foreach (X509Certificate2 cert in selectCollection)
{
return cert;
}
return null;
}

Unknown dijo...

Me ayudo mucho tu blog, muchas gracias, ya logré firmar el archivo xml con token, en Java.

Anónimo dijo...

Hola como están?, alguien consiguió firmar correctamente el xml en C# o Vb.net?...
Lo he estado intentando pero no logro colocar los namespace de etsi...y si no los coloco me da error al enviar al web service y si los coloco manualmente me da error en la integridad de la firma...
cualquier ayuda bienvenida, podemos colaborar...
Un saludo.

David dijo...

Saludos.

Tengo un problema. Me da un error en un import:

import adsi.org.apache.xml.security.utils.resolver.ResourceResolverSpi;

de la clase FirmaXML de la libreria MITyClibXADES.

Estoy utilizando la version 1.1.7 que es la ultima que esta para descargar.

Alguna idea? Llevo bastante tiempo dandole vueltas y no saco ninguna.

Muchas gracias

Anónimo dijo...

Hola. Alguien que me ayude con la firma en vb.net. Cuánto me cobraria x eso.

Gracias.

Anónimo dijo...

¿Quien tiene el ejemplo de Fense funcionando?

Mi correo CGOMEZGYE@HOTMAIL.COM

y a como $$

Anónimo dijo...

Saludos amigos.
en la seccion firma,

es necesario las 3 referencias SignedInfo...??

y Es necesario especificar el etsi namespace qualified para cada elemento??

Cualquier ayuda es muy apreciada.
Gracias

Unknown dijo...

El esquema de como debe quedar la firma esta descrita en los archivos provistos de la pagina del sri,

Unknown dijo...

Saludos cordiales, estoy intentando realizar la firma del xml con la firma electrónica en archivo p12 proveída por el Banco Central del Ecuador con C#.
Mi pregunta es si alguien lo consiguio para que me oriente, gracias de antemano

Vinfer dijo...

Que tal Marco Yuquilima.

Yo tambien estoy trabajando con el token usb, logre firmar el archivo xml, quisiera consultarte si tu estas trabajando en el tema del sri, porque yo al momento de enviar a los web service del sri tengo la respuesta RECIBIDA pero al momento de autorizar me da el error FIRMA INVALIDA El comprobante puede estar modificado o no ser valido.

Te ha pasado esto..? si me puedes ayudar mi correo es vinferm83@gmail.com

Saludos

Unknown dijo...

Amigos les dejo mi correo si desean consultoria sobre la firma o el envío del xml a los webservice del SRI.

sistemas_orellana@hotmail.com

Anónimo dijo...

No se si le pasa ha alguien
pero el servicio del SRI timesout después de un minuto aproximadamente. Sucede
al enviar una factura en el primer webservice del SRI "Recepción de comprobantes" establece el handshake pero nunca recibo una respuesta de vuelta y luego de un minute (57 segundos para ser exacto) times out..me paso varias veces el fin de semana. Alguien sabe o tiene información o algún dato sobre esto y podría compartirlo ??? Estoy en la etapa de pruebas y uso .NET
Gracias

Anónimo dijo...

Dogui...

Esta linea es la direfencia y funciona a la perfeccción... Gracias por tu aporte. Ya envia y me autorizo el SRI el comprobante.
dataToSign.addObject(new ObjectToSign(new InternObjectToSign("comprobante"), "contenido comprobante", null, "text/xml", null));

Saludos
Ap

Anónimo dijo...

estimados yo poseeo los procesos de envio y autorizacion esta funcionando perfectamente solo falta la firma, yo actualmente poseo la una funcion de firma pero me sale el mensaje DEVUELTA

me pueden escribir a mi correo

trabajos1979@hotmail.com

saludos

Alejandro

Anónimo dijo...

Con esa linea ya se puede firmar. Tengo esta consulta : Despues de firmar genera el archivo y a continuacion deseo recuperarle para llamar al web service pero tengo el error que el archivo esta en uso por el proceso de firmado. Como puedo hacer para que el proceso cierre el archivo y lo pueda usar con el proceso de llamar al web service.

Anónimo dijo...

Buen dia estimados quien de ustedes posee la firma electrónica 100% C# o VB.net que no utilice librerías java convertida a dll, podemos cambiar con el consumo WS que los tengo funcionando al 100%

mi correo es

trabajos1979@hotmail.com

saludos

Alejandro

Unknown dijo...

yo tengo todo el proceso de firma y envio de xml al web service del SRI en c# y visual basic.
Cualquier inquietud aqui dejo mi correo.

jaco-47@hotmail.es

Unknown dijo...

skype jaco-a_cool@hotmail.com

Anónimo dijo...

Estimados.

Para quienes desarrollan en visual Fox. Ya tengo la dll para la firma electrónica y el consumo.

alex1980ec@hotmail.es

Gracias Fense por tu foro que fue de gran ayuda.

Anónimo dijo...

Dogui Gracias por tu ayuda.. estoy implementando tu archivo y me sale el siguiente error DER Input, Intefer tag error.

estoy utulizando el eToken BCE color azul...otra pregunta en que donde esta ubicado el certifica en usb.. gracias

Anónimo dijo...

Saludos, alguien que me pueda facilitar una factura de ejemplo que se encuentre firmada gracias

Unknown dijo...

LAguien me pude ayudar si la firma en Lote es la misma o cambia el algoritmo lo estoy haciendo en Java.

Saludos

Anónimo dijo...

Aunque no he participado en este foro me parece poco profesional que algunas quieran ahora retribucion economica en base a la ayuda y debates que se dieron en el mismo.

Unknown dijo...

Busco Socios estrategicos para comercializar mi plataforma de FACTURACION ELECTRONICA ezDOC, esta desarollada enteramente en c# y vb.net, ademas ya tengo el portal en asp.net para colgar los comprobantes autorizados. Informacion al 0994997076 o escribir a ventas@ezdoconline.com

Unknown dijo...

Ofrezco solución sencilla para la Facturación Electrónica desarrollada en C# y en Visual Basic, implementada en Visual Fox Pro, Power Builder y en el mismo Visual Studio. Información a este correo jaco-47@hotmail.es o Skype jaco-a_cool@hotmail.com.(Precios Accesibles)

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

descargue el codigo pero igual el SRI me rechazo el xml alguien me podria decir por hay un nodo del xml no se llena como es:
ds:Reference Id="Reference-ID-246198" URI="" deberia estar URI="#comprobante"

Anónimo dijo...

Alguien que pueda ayudar a firmar con librerias propias de c#, gracias

Unknown dijo...

Estimados buenas noches, para las personas que han tenido la necesidad de poder depurar su base de datos obteniendo los datos reales del nombre de una persona o la razon social de una empresa y saber si esta activo o no ya sea por su cedula o ruc, tengo disponible una aplicacion que hara eso por ustedes pueden cargar los ruc o cedula que desean validar desde una hoja de excel para poder obtener sus datos los que esten interesados les dejo mi correo sistemas_orellana@hotmail.com indicar el motivo que del SRI, solo los que esten interesados, buenas noches suerte en sus proyectos.

Unknown dijo...

Que tal mis estimados, los que deseen generar el ride de una forma facil y sencilla partiendo del xml ya sea autorizado o sin autorizar contactarse conmigo, por favor solo los que esten interesados.

indicar que es sobre el RIDE.

sistemas_orellana@hotmail.com

Suerte en sus proyectos.

Unknown dijo...

Estimados les dejo el codigo de como uso las dll para enviar a autorizar un archivo xml, es sumamente sencillo

Dim ws As New WebServiceSRI.WebService
Dim resSRI As EstadoSRYType = EstadoSRYType.NOAUTORIZADO
'--------------------------------------------------------------------------------------------
Try
'----------------------------------------------------------------------------------------
'ENVIO A AUTORIZAR EL COMPROBANTE XML
'----------------------------------------------------------------------------------------
resSRI = ws.sendComprobante(rutaArchivoXML, rutaRespuestaSRIXML)
'----------------------------------------------------------------------------------------
'VERIFICO SI EL COMPROBANTE FUE AUTORIZADO
'----------------------------------------------------------------------------------------
If resSRI = EstadoSRYType.AUTORIZADO Then
Dim aut As WebServiceSRI.Autorizacion = ws.AutorizacionComprobante.Autorizacion
'------------------------------------------------------------------------------------
MsgBox(String.Format("Clave de Acceso:{1}{0}Tipo Emision:{2}{0}Numero Autorizacion:{3}{0}Fecha Autorizacion:{4}{0}", vbCrLf, ws.ClaveAcceso, ws.TipoEmision, aut.NumeroAutorizacion, aut.FechaAutorizacion))
'------------------------------------------------------------------------------------
aut = Nothing
ElseIf resSRI = EstadoSRYType.NOAUTORIZADO Then
'MUESTRO LOS MENSAJES DE ERROR QUE OBTUVO AL QUERER AUTORIZARLO
For Each mensaje As WebServiceSRI.Mensaje In ws.Mensajes
MsgBox(String.Format("Mensaje Error:{0}", mensaje.InformacionAdicional), MsgBoxStyle.Critical)
Next
Else
'SI ENTRA POR AKY ES PORQUE NO HAY CONEXION A LOS WEBSERVICES DEL SRI
MsgBox("No hay conexion a los webservice del SRI", MsgBoxStyle.Exclamation)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
'--------------------------------------------------------------------------------------------
ws = Nothing

Unknown dijo...

Los que deseen asesoria sobre facturacion electronica este es mi correo.

sistemas_orellana@hotmail.com

indicar que es sobre asesoria

Suerte en sus proyectos

Unknown dijo...

A todos los que estén trabajando en la facturación electronica, les comento que logre solucionar todos los inconbenientes que tenia al respecto contactando con Jean Carlos Ordoñez, pues realmente propone una solución efectiva y sencialla, por lo que le estoy muy agradecido a El por el apoyo que me ha brindado en este tema.

Unknown dijo...

Ah!! se me olvidaba este es el correo de Jean Carlos Ordoñez:
jaco-47@hotmail.es

Anónimo dijo...

buenas tardes alguien que me pueda ayudar cual es el webservice de factura por lotes porque esta no responde
https://celcer.sri.gob.ec/comprobantes-electronicos-ws/RecepcionLoteMasivo?wsdl

Unknown dijo...

Esta semana ha estado pesimo los webservices del SRI de pruebas ha sido una locura a lo mejor como ya viene navidad estan en intermitenitencia.

Unknown dijo...

Necesito socios estrategicos para comercializar Facturacion Electronica solo interesados contactar a ventas@ezdoconline.com o al 0994997076, o si necesitan alguna asesoria.

Anónimo dijo...

Estimados buen día, llevo días probando las dos opciones que presentan aquí, pero al momento de mandar a firmar no hace nada.. gracias por su ayuda.. nine1982666@hotmail.com

Anónimo dijo...

Luis Sancho Sánchez, yo sigo sin poder firmar, firmé una vez y luego ya no pude, sería tan amable de ayudarme?? nine1982666@hotmail.com

Unknown dijo...

Saludos, en caso de que alguien necesite asesoría en vb6, .NET o JAVA, mi correo es desarrollo@datumtecnologia.com. He logrado desarrollar la firma del comprobante y consumo de servicios web en estas plataformas.

Unknown dijo...

Ofrezco solución sencilla para la Facturación Electrónica desarrollada en C# y en Visual Basic, implementada en Visual Fox Pro, Power Builder y en el mismo Visual Studio. Información a este correo jaco-47@hotmail.es o al numero 0994951165.(Precios Accesibles)

Anónimo dijo...

Ofrezco repositorio seguro para almacenar documentos, fácil de utilizar mediante web service, provee:
Web service para crear cliente básico, recibir XML firmado+PDF, etc.
Una cuenta gratuita para que el cliente descargue sus documentos.
Un portal web para consulta de documentos.
Envía el correo con los adjuntos desde una dirección firmada que no va a spam.
contacto: rene.aravena gmail.com

Unknown dijo...

Facturación electrónica al alcance de tus manos usando una sola DLL hará todo por ti firmar, autorizar generar el RIDE y enviarlo por correo

Sistemas_orellana@hotmail.com

Anónimo dijo...

Estimados del foro.
Alguien me puede guiar con información de como firmar electronicamente un xml y autorizar para el SRI, pero con VFP 9.0 y sin DLL.

Unknown dijo...

Hola me pueden ayudar, que certificado es mejor de los que da el banco central token, hsm o archivo estandarx.509 y con cual es mas facil de trabajar

jMaster dijo...

Patricio con el archivo es mas sencillo

Lamda Zayor dijo...

Luego de firmar el archivo lo valido pero se cae con una excepción que dice la entrada no es una cadena base 64 valida.Que puede estar mal...y del ws del sri me sale firma y/o certificado invalido.
Alguien me puede ayudar...

Unknown dijo...

Ofrezco solución sencilla para la Facturación Electrónica desarrollada en C# y en Visual Basic, implementada en Visual Fox Pro, Power Builder y en el mismo Visual Studio. Información a este correo jaco-47@hotmail.es o al numero 0994951165.(Precios Accesibles)

Anónimo dijo...

Para los que tengan el siguiente error: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found,

deben realizar el siguiente cambio:

private Document LoadXML(string path)
{
// It seems the com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl class is not loaded and so the factory can not create it.
// Adding this line in before the call to the factory forces the assembly to load, and then the factory can see it and everything works as expected...
com.sun.org.apache.xerces.@internal.jaxp.SAXParserFactoryImpl s = new com.sun.org.apache.xerces.@internal.jaxp.SAXParserFactoryImpl();

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
return dbf.newDocumentBuilder().parse(new BufferedInputStream(new FileInputStream(path)));
}

Cuando tenga el código nativo en C# con mucho gusto lo comparto con toda la comunidad, de forma gratuita.

jlga dijo...

Gracias, lo publicado por Dogui funciona correctamente con la modificacion indicada por el anonimo en C#
dataToSign.addObject(new ObjectToSign(new InternObjectToSign("comprobante"), "contenido comprobante", null, "text/xml", null));
Todo bien en C# con las librerias migradas

JlgaPp dijo...

Por cierto me olvidaba comentarles que cuando se firman los docuemtnos en el mismo procedimieto se desean enviar estos se quedan bloqueados por que estan siendo usados. para solucionar este inconveniente en C# usar


// Guardamos la firma a un fichero en el home del usuario

using (FileOutputStream fileOut = new FileOutputStream(strPathXMLSalida))
{
UtilidadTratarNodo.saveDocumentToOutputStream((Document)res[0], fileOut, true);
}

Anónimo dijo...

Saludos amigos, alguien esta implementado este proceso usando PHP y como esta haciendo el consumo ws

Anónimo dijo...

ayuda por favor, estoy implementando la facturacion en java y tengo el siguiente error

"ClaseGenericaFirma.java": imposible acceder a es.mityc.firmaJava.libreria.xades.DataToSign,archivo de clase incorrecto C:\SistemaMorfeo\jar\MITyCLibXADES-1.1.7.jar\es\mityc\firmaJava\libreria\xades\DataToSign.class,el archivo de clase tiene la versión incorrecta 50.0, debería ser 48.0,Elimínelo o compruebe que aparece en el subdirectorio correcto de la vía de acceso a clases. en la línea 47, columna 42

Carlos dijo...

Alguien tendra un cretificado de prueba que me puedan proporcionar?

Saludos

Unknown dijo...

Estimados solo por el mes de noviembre estoy dejando la dll que te firma válida autoriza te trae la respuesta del sri te genera el RIDE y luego te lo envía por correo aun costo módico de 650 dólares solo una dll al alcance de tus manos no usa librerías de java usa solo .net puro solo interesados.

Sistemas_orellana@hotmail.com
skype leo24832

Unknown dijo...

Hola , tengo la solucion de la factura electronica si deseas el codigo en Java te cuesta $80
Firma y Web Services

Me avisas cualquier novedad
leoberru@hotmail.com

Unknown dijo...

Estimados por Black Friday el precio de la dll que firme valide autoriza traiga la respuesta del sri genere el RIDE y lo envié por correo tendrá un costo de 500 solo una dll al alcance de tus manos usa solo .net puro. Y puede ser usada en vb 6.0 vb.net visual fox pro genexus o cualquier lenguaje que utiliza dll activex.

Unknown dijo...

Ofrezco solución sencilla para la Facturación Electrónica desarrollada en C# y en Visual Basic, implementada en Visual Fox Pro, Power Builder y en el mismo Visual Studio. Información a este correo jaco-47@hotmail.es o al numero 0994951165.(Precios Accesibles) La Firma esta desarrollada con librerías de java convertidas en Dll y con librerías propias de .NET

Unknown dijo...

tengo implementada la firma gracias a los aportes hechos aqui, pero al enviarla al sri me sale DEVUELTA, al parecer esta mal firmado, como puedo validar la firma. gracias de antemano

Unknown dijo...

El Sri a parte de la respuesta devuelta tambien devuelve el motivo.

Te recomiendo cual es el mesaje que se publica ahi para poderte ayudar

Unknown dijo...

Alcivar Arcos te recomiendo verificar las dependencias que estas usando.

Unknown dijo...

Es mejor usar el archivo plano .p12 es mas facil

Unknown dijo...

agregando la referencia algo pude hacer con el envio me daba como estado DEVUELTA y el array vacio no me dice que esta mal solo me devuelve vacio, para autorizacion me perdi y no di como por lo anterior, con HttpWebRequest si estoy mas perdido

Anónimo dijo...

Estimados, alguien que pueda ser tan gentil de compartir el codigo, recordemos que todos aprendemos de todos y es lamentables que como Ecuatorianos seamos tan egoistas. Agradecido de por vida a la(s) persona(s) generosa :)

Anónimo dijo...

El servidor del sri me envia este error
Tengo el siguiente mensaje:

Error 58

El tipo de comprobante 10 contenido en la clave de acceso no corresponde al de la etiqueta 1
Indica que hay un problema de estructura de clave acceso alguien sabe como resolverlo

KLeber dijo...

Gracias Jaco por la ayuda con la firma

Anónimo dijo...

Hola amigos,


Aqui pueden descargar la DLL https://www.dropbox.com/s/m436fip9apdis3b/ecuador20141007.zip?dl=0 ,
favor de mirar el leeme.txt y el ejemplo en foxpro, vb6 o Vbnet.

Se incluye tambien la lista de declaraciones de funciones para PowerBuilder.

Es de 32 bits, hecha en C++.

El firmado es nativo, sin Java o .net .

Hace la firma, envío y petición de autorización, No genera el PDF.


Más detalles, el costo y licenciamiento se mencionan en http://facturaelectronicaecuador.com/

Feliz Navidad a todos !

Anónimo dijo...

Saludos..
Podrian ayudarme como se construye la firma misma, les explico:
1.Fuí al bce.gob.ec.
2.Me dieron un archivo .p12
Pense que el contenido de ese archivo debia tal como esta pegarlo en el XML, y de esa forma ya estaría firmado, o sorpresa que el contenido esta codificado, y la verdad no se que hacer con esa informacion recibida del BCE.
Chequeando en la web vi que el firmado se lo debe hacer en el formado XADES-BES, esta estructura tiene un encabezado, no se como se contruye por que creo que es diferfente para cada RUC EMISOR, entonces me podrian explicar minuciosamente los pasos para construir el bloque de forma y pegar en el xml, porque sigo pensando que debo pègar el contenido.......estoy confundido.
Ya tengo constuido la parte de WS y si funciona bien, por que le envio el archivo xml sin firmar y me indica error.
Gracias

RicBalda dijo...

Estimado anomimo, aquí esta es link que es de gran ayuda

http://sviudes.blogspot.com/2010/05/facturae-con-net-y-c.html

Anónimo dijo...

Estimados aqui dejo un DEMO de facturacion electronica hecha en .NET c#

https://www.youtube.com/watch?v=En8Jxumh4aw

ver contactos en youtube

Anónimo dijo...

Hola foreros, necesito aprender la parte de firmado de facturacion electrónica.

Pero con codigo VFP9 al 100%.

Alguien puede darme clases, contactemen al 0999262429.

Vinfer dijo...

Hola con todos.

Necesito su ayuda. AL firmar con TOken en windos de 64 bits me da el error de no existir j2pkcs11.dll en las librerias de java.. al trabajar en windows de 32 bits me funciona todo normal.

Alguien se ha encontrado con este error..?

Anónimo dijo...

Hola Winfer.

Seguramente es por que la Dll no esta resgitrada.
Copia manualmente la dll en c:\windows\syswow64, luego ejecuta el cmd.exe con boton derecho como administrador y ahi pones regsvr32 y el nombre de la dll.
Con esto deberia funcionar a la perfeccion

fyagual dijo...

Anonimo tengo lo fuentes para la firma en .NET , te lo cambio con el consumo del web service.

Unknown dijo...

https://plus.url.google.com/url?sa=z&n=1421281586085&url=https%3A%2F%2Fdrive.google.com%2Ffolderview%3Fid%3D0B7D1dOu_3WtTaVZISEI1TnpXZkk%26usp%3Dsharing&usg=ayqIRsf-KkgBT9GfYd4ceZzv3m8.

Anónimo dijo...

El ejemplo de Dogui trabaja excelente

Anónimo dijo...

Buenos días a todos

Estoy utilizando la libreria XadaesNet para hacer la firma y toda va bien hasta cuando voy a agregar el reference del Key Info siempre me muestra error y me dice que al referencia esta mal formada, no se que estoy haciendo mal, les agradeceria si alguien a trabajado con esta libreria y me puede ayudar

Unknown dijo...

Estimados les dejo un demo en donde podran realziar el proceso de facturacion Electronica, todo esta realizado en .NET

LINK:

http://goo.gl/eoUUxh

codeadict dijo...

Excelente post, ha sio de mucha ayuda estoy desarrollando mi librería para Python y Go por si alguien requiere

Anónimo dijo...

Buenas tardes, alguien que tenga el código de la firma con el token eToken Pro del BCE??

Gracias de antemano.

Unknown dijo...

Estimados les dejo un demo sobre la Facturacion Electronica


https://drive.google.com/folderview?id=0B7D1dOu_3WtTaVZISEI1TnpXZkk&usp=sharing

Este permite firmar con token o con archivo p12 o pfx.

Anónimo dijo...

Tengo todo el programa para firmar con firma digital basada en archivo, pero necesito el código en c# para la firma del xml con Token.

Si pueden colaborar "free" chévere, caso contrario que me digan cuánto me cuesta el código y negociamos.

Yoelvys Martinez dijo...

Buenas tardes, tengo ya facturacion electronica con java, donde a traves de un servicio web puedes integrarlo con cualquier lenguaje de prog y hacer TODOOO el proceso de facturacion. Ahorita estoy haciendo mi version DLL, ya que veo la afluencia de personas que necesitan una dll y los precios tan elevados de las ofertas. Ahorita necesito la firma en c#, cualquier ayuda sera bien recibida, Ya mi sistema en java esta en produccion, por si alguno tiene alguna duda o quiere hacer negocios.

Viper dijo...

Les pido que se pasen por: http://webcarreno.org/index.php/tutorials/28-sri-tutorial/24-sri-firma-digital-xades-bes, http://webcarreno.org/index.php/tutorials/28-sri-tutorial/27-consumo-de-web-services-sri-envio-de-y-recepcion-de-autorizacion, http://webcarreno.org/index.php/tutorials/28-sri-tutorial/25-consumo-de-web-services-sri-envio-de-comprobantes

Van a encontrar la solución a todos sus problemas y sin tener que pagar nada.

El conocimiento no sirve de nada si no se lo comparte...

Anónimo dijo...

Amigos les dejo una solucion en vb.net con la firma electronica con solo un dll, en la solucion se explica a detalle el uso del mismo, espero les sea de ayuda.
http://1drv.ms/1DNLmNA

Unknown dijo...

De principio suena un poco complejo, pero hay que comprender bien el nuevo sistema de facturación electrónica en Ecuador, para no tener fallos y poder cubrir las exigencias de este nuevo régimen fiscal.

Anónimo dijo...

Hola.

Alguien que me venda el código fuente en .net puro para firmar, lo tengo en .net mas las librerias de java. Mi correo jf.quintana@hotmail.com

Gracias.

AndySerrato dijo...

Hola chicos,

Tengo este mismo sistema implementado, pero necesito documentos en distintos formatos (no sólo XML). Al llamar a la función getDocument el programa se queda pensando y no hace nada. Sí alguien tiene alguna referencia os agradecería la ayuda.

Entre otras cosas también tengo un error debido a que el sistema orginalmente no hacía enveloped y simplemente le he colocado el enveloped a true y me sale un null pointer en

es.mityc.firmaJava.libreria.xades.FirmaXML.signFile

Unknown dijo...

Urgente necesito firmar desde un token quiero soporte urgente.

alfon dijo...

Hola, para contarles que acabo de implementar la firma electrónica en formato XAdES-BES en visual .net nativo sin librerías.

Para ello me basé en el siguiente artículo:

https://www.jybaro.com/blog/firma-electronica-de-factura-electronica/

Allí está implementado en javascript pero mas allá de eso, el algoritmo es tan fácil de seguir que su comprensión facilita su implementación en cualquier lenguaje.

Suerte con sus proyectos !

Santiago Celi dijo...

Chicos, necesito que haga todo en PHP, si lo tienen y funcionando todo el proceso al 100% para hacerles parte de un proyecto, yo tengo todo funcionando al 100% en java me inetresa en PHP integramente, la parte de firmado, comunicacion al SRI, la obtencion de respuestas sea error, no autorizado, y autorizado, WS, utilizando los arhivos de firma electronica .p12 del banco central
mi correo sanceli@hotmail.com

Unknown dijo...

Funcionaría igual con la especificación Xades-EPES? alguien lo ha intentado? Porque trato de ingresar a los links que hay al principio de la entrada pero pareciera que el servidor está caído.



The following error was encountered while trying to retrieve the URL: http://oficinavirtual.mityc.es/componentes/componentes-1.1.7-with-deps.zip

Connection to 193.146.1.70 failed.

The system returned: (111) Connection refused

The remote host or network may be down. Please try the request again.

Your cache administrator is webmaster.

Anónimo dijo...

alguien que tenga codigo para firmar electronicamente en visual fox

svycar dijo...

Alguien puede compartir el código de la firma en csharp
gracias..

svycar dijo...

Alguien puede compartir el código de la firma en csharp
gracias..

Carlos Desiderio dijo...
Este comentario ha sido eliminado por un administrador del blog.
Anónimo dijo...

hola cuando agrego otra referencia me sale referencia mal formada trabajo en c# esto es al monento de firmar

Sistemas Informáticos dijo...

Buena ayuda, gracias a tu post tengo todo el proceso de firmado en c# nativo, java nativo, en php nativo me funciona pero a veces me falla con uno q otro .p12, no me he dado tiempo en ver q sera.

Unknown dijo...

Hola, Alguien me podria ayudar con el codigo C# para la firma del XML de facturacion electronica.

Unknown dijo...

Me podrian ayudan con el codigo C# de firma XML - SRI Ecuador

Unknown dijo...

Hola, disculpa me puedes ayudar tengo la facturación electrónica, como la del ejemplo que explicas, pero el SRI Ecuador cambio la firma de los archivos XML, antes se firmaba con Cifrado de clave (Key Encipherment) y ahora dices que al partir del 8 de ENERO del 2020 toca firmar con Firma Digital (Digital Signature) y no se donde se debe cambiar me puedes ayudar indicando por favor

William Ochoa dijo...

Los que aún requieran facturación electrónica, vendo las dlls para firmar el xml, enviar, autorizar, y generar el ride, por el módico precio de 200 dólares.
También vendo sistema punto de venta y gestión de inventario web con facturación electrónica incluida,precios desde 20 USD. Más info a mi correo William.Ochoa@xpertsolutions-it.com

CARLOS dijo...

Hola amigos me pueden ayudar con el codigo para firmar archivos xml muchas gracias carvillacis@hotmail.com

Anónimo dijo...

saludos alguien que me pueda ayudar con el codigo fuente para hacer el firmado en c# les quedo agradecido mi correo es sierra_xavier@hotmail.com