Validación de firma electrónica en los archivos XML en el sistema de comprobantes electrónicos SRI Ecuador

El Servicio de Rentas Internas de Ecuador comunica por medio de correo electrónico a los contribuyentes que emiten comprobantes electrónicos que a partir del 8 de enero de 2020 en el ambiente de producción del sistema de comprobantes electrónicos se implementará la validación del uso del archivo de la firma digital correcto, esto es, que el XML este firmado con el archivo de «Firma digital (Digital Signature)» y no con el archivo «Cifrado de clave (Key Encipherment)», esto en concordancia con los estándares internaciones de firma electrónica.

En ambiente de pruebas ya esta implementada la validación, al no estar firmado correctamente aparece el siguiente error «FIRMA INVALIDA El certificado utilizado, no es del tipo firma digital».

Se recomienda actualizar el programa de firma electrónica, validar en ambiente de pruebas y luego en ambiente de producción.

La aplicación QuijoteLui Firmador ya se encuentra actualizada:

https://gitlab.com/allku/QuijoteLuiFirmador

53 thoughts on “Validación de firma electrónica en los archivos XML en el sistema de comprobantes electrónicos SRI Ecuador

  1. Long time reader, first time commenter — so, thought I’d drop a comment..
    — and at the same time ask for a favor.

    Your wordpress site is very simplistic – hope you don’t mind me asking what theme you’re using?
    (and don’t mind if I steal it? :P)

    I just launched my small businesses site –also built in wordpress
    like yours– but the theme slows (!) the site down quite
    a bit.

    In case you have a minute, you can find it by searching for «royal cbd» on Google (would appreciate any feedback)

    Keep up the good work– and take care of yourself during the coronavirus scare!

    ~Justin

  2. Estimado Jorge Luis, que es lo que se debe hacer. Solicitar otro certificado o ese parámetro se cambia de alguna forma manualmente. Por favor si me puedes ayudar con esta duda.

  3. Hola Jorge te saluda Jordan Ordoñez me puedes ayudar con tu correo electrónico tengo mi proceso de firmado en C# pero en ambiente de pruebas no me funciona y me gustaría que me ayudes a intentar el firmado con el nuevo proceso del ambiente de pruebas. mi correo es jordanvicente_21@hotmail.com. Te agradecería que me contactaras para poder conversar del tema.

  4. hola buen día, espero estes bien de salud. Sabes he usado tu código para firmar con SecurityData y me ha funciona muy bien. la semana pasada me dieron otro archivo p12 de SD pero con esto no puedo firmar el xml. Me dicen en SD (los he llamado) y me indican que es que cambiaron de CER a CRT. pregunto: hay que actualizar algo en el proyecto? te agradezco la ayuda

    1. Hola, buen día. La última vez que firme con Security Data habían creado una nueva entidad (SECURITY_DATA_SUB_2(«AUTORIDAD DE CERTIFICACION SUBCA-2 SECURITY DATA», «ENTIDAD DE CERTIFICACION DE INFORMACION», «SECURITY DATA S.A. 2», «EC», «1.3.6.1.4.1.37746»)). Para ello subí una actualización de QuijoteLuiFirmador 2.1 del 2021-03-17. Prueba por favor descargar la nueva versión y probar el firmado. No olvides de añadir el parámetro TokensAvailables.SD_EPASS3000 en el método de firmado así -> xadesBesFirma.sign(archivoXML,
      urlOutArchivoXML,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.SD_EPASS3000);
      Me comentas por favor si funciona o no.

  5. Por que se genera este error al enviar el anexo CRS:
    Linea: 327|cvc-complex-type.2.4.d: Se ha encontrado contenido no válido a partir del elemento ‘ds:Signature’. No se espera ningún elemento secundario en este punto.

    1. Verifica por favor primero esto:
      /*
      Para firmar con un certificado emitido por le BCE
      */
      xadesBesFirma.sign(archivoFirmar,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.BCE_IKEY2032);

      /*
      Para firmar con un certificado emitido por le Security Data
      */
      xadesBesFirma.sign(archivoFirmar,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.SD_EPASS3000);
      /*
      Para firmar con un certificado emitido por el Consejo de la Judicatura
      */
      xadesBesFirma.sign(archivoFirmar,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.KEY4_CONSEJO_JUDICATURA);

  6. Hola Jorge sabes estoy usando el código para firmar un archivo xml pero me da un error en el alias en la funcion selectCertificate tengo dos firmas digitales una del Banco Central y otra de security data el aliaskey es el problema me retorna null si me puedes ayudar con eso amigo muy agradecido
    Exception in thread «main» java.lang.NullPointerException: Cannot invoke «String.toLowerCase(java.util.Locale)» because «alias» is null
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetCertificate(PKCS12KeyStore.java:479)
    at java.base/sun.security.util.KeyStoreDelegator.engineGetCertificate(KeyStoreDelegator.java:100)
    at java.base/java.security.KeyStore.getCertificate(KeyStore.java:1108)
    re.java:141)
    at com.quijotelui.firmador.XAdESBESSignature.sign(XAdESBESSignature.java:78)
    at com.quijotelui.firmador.Main.main(Main.java:38)

    1. Hola Andrés, comentame si estás usando el último parámetro del método xadesBesFirma.sign según corresponde el certificado.

      Verifica por favor primero esto:
      /*
      Para firmar con un certificado emitido por le BCE
      */
      xadesBesFirma.sign(archivoFirmar,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.BCE_IKEY2032);

      /*
      Para firmar con un certificado emitido por le Security Data
      */
      xadesBesFirma.sign(archivoFirmar,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.SD_EPASS3000);
      /*
      Para firmar con un certificado emitido por el Consejo de la Judicatura
      */
      xadesBesFirma.sign(archivoFirmar,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.KEY4_CONSEJO_JUDICATURA);

      1. Hola Jorge dependiendo del certificado uso algunos de estos y los demás los tengo comentados estoy realizando debug y es la parte en nombres donde espera recibir una lista de alias en donde me da el error. Cual podría ser el error pero quería agradecerte por un gran trabajo y es la pregunta?

  7. Hola.
    Tengo problemas para firmar digitalmente un documento xml con PHP.
    por favor, ayúdame
    [identificador] => 39
    [mensaje] => FIRMA INVALIDA
    [informacionAdicional] => La firma es invalida [Firma inválida (firma y / o certificados alterados)]
    [tipo] => ERROR

  8. Buenas noches, una pregunta para usar la firma con Nodejs de security data, como podría hacerlo, al momento tengo un error 39, muy agradecido por tu atención

      1. he seguido ese tutorial de jybaro, pero existe un error con la encriptación del singedProperties.
        Sabes cual es proceso para la encriptación de valor de hash.

  9. hola buena tarde tengo un problema a firma con el toke ANF(ANF Autoridad Intermedia)
    me dice q el toque no es valido.
    uijoteLui Firmador
    Archivo Firma P12: C:\comprobantes\firma\certificado1.p12
    Exception in thread «main» java.lang.NullPointerException
    at sun.security.pkcs12.PKCS12KeyStore.engineGetCertificate(PKCS12KeyStore.java:489)
    at java.security.KeyStore.getCertificate(KeyStore.java:1081)
    at com.educz.firmador.GenericXMLSignature.execute(GenericXMLSignature.java:140)
    at com.educz.firmador.XAdESBESSignature.sign(XAdESBESSignature.java:78)
    at com.educz.firmador.Main.main(Main.java:62)
    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    C:\Users\Usuario\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 3 seconds)
    me podría ayudar

    1. Hola José. Cuál es el sitio web de ANF Autoridad Intermedia? Actualmente están soportados los certificados emitidos por: BCE, Security Data y Consejo de la Judicatura

  10. Hola, me puedes explicar un poco más detallado de como usarlo, estoy usando la versión del firmador 2.1. Ahora intento ejecutar lo siguiente en el CMD:

    java -jar C:\Users\perez\Downloads\QuijoteLuiFirmador-main\QuijoteLuiFirmador-main\dist\QuijoteLuiFirmador-2.1.jar C:\xampp\htdocs\sri\2707202201172623987200110010010000000111234567811.xml C:\xampp\htdocs\sri\prueba C:\xampp\htdocs\sri\identity.p12 vbb140813 TokensAvailables.BCE_IKEY2032

    Pero al ejecutar me muestra el siguiente mensaje:

    Usage: java -jar firmador.jar

    En si no se exactamente si esto es solo agregar esto: TokensAvailables.BCE_IKEY2032 o es que se necesita obtener un token o código.

    Me puedes indicar que estoy haciendo mal, gracias.

    1. Hola Edgar. Prueba por favor con java 8 de oracle. Lo que se añadió en la versión 2.1 es la entidad emisora del certificado. Por ejemplo en método Main, eliges uno de las 3 llamadas dependiendo de donde pediste tú certificado:

      /*
      Para firmar con un certificado emitido por le BCE
      */
      xadesBesFirma.sign(archivo,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.BCE_IKEY2032);

      /*
      Para firmar con un certificado emitido por le Security Data
      */
      xadesBesFirma.sign(archivo,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.SD_EPASS3000);

      /*
      Para firmar con un certificado emitido por el Consejo de la Judicatura
      */
      xadesBesFirma.sign(archivo,
      urlOutArchivo,
      PKCS12_RESOURCE,
      PKCS12_PASSWORD,
      TokensAvailables.KEY4_CONSEJO_JUDICATURA);

      Actualmente solo se soporta las tres entidades certificadoras.

      También usa el UTF8, así:
      https://mestizos.dev/java-utf8-windows/

  11. Hola que tal, espero que todo bien, se que no son dudas, muy aceptables, para lo que intento hacer, pero quiero firmar comprobantes de factura xml, con la libreria, QuijoteLuiFirmador, sin embargo de momento, me falta pasarle un parametro a esta funcion, y seria TokensAvailables.* enserio, no he tenido acceso a la documentacion y la informacion que he encontrado ha sido poca. Estoy llamando la libreria desde php, si pudieran aclararme en esta duda estaria muy agradecido.

    1. Hola Janker. Claro que sí. En el método xadesBesFirma.sign(…) recibe como último parámetro «TokensAvailables». Si, el certificado con el cual vas a firmar lo emitió el Banco Central entonces será: TokensAvailables.BCE_IKEY2032. Para firmar con un certificado emitido por Security Data: TokensAvailables.SD_EPASS3000. Para firmar con un certificado emitido por el Consejo de la Judicatura: TokensAvailables.KEY4_CONSEJO_JUDICATURA.
      El vídeo está desactualizado ya que en aquel entonces solo se podía firmar con certificado emitidos por el BCE.

  12. Hola Jorge, espero esten bien. te saluda Juan. Tengo un TOKEN fisico de SECURITY DATA como hago para firmar un Docuemnto Electronico? que parametros puedo pasar para hacerlo correctamente?

    1. Hola Juan, hace tiempo que no he firmado con token, y de Security Data no lo he probado. En el repositorio está el código fuente para hacerlo https://gitlab.com/allku/QuijoteLuiFirmador, tendrías que probarlo por tú cuenta ya que yo no dispongo de un token emitido por Security Data. El archivo que necesitas es GenericXMLSignature.java y el método se llama execute(). Espero sea de tu ayuda, saludos

  13. Hola, saludos desde Machala, soy desarrollador independiente y quiero agradecerte estos recursos, he logrado ya generar el xml con jaxb, lo he firmado con tu proyecto, y tbn ya lo he logrado autorizar con el sri asi mismo con tu proyecto; por favor ayudanos con actualizaciones a tus repos en caso de que el sri le aguregue o modifique cosas.

      1. Muchas gracias por responder Jorge Luis, en el printer, cuando genera el RIDE, actualmente no ubica las formas de pago, (la informacion adicional si), como se podria hacer para agregar las formas de pago?

        1. Hola, lo que yo hago es, las forma de pago les agrego en la información adicional. En el XML si las pongo, y el momento de generar el PDF las envío a la información adicional, nunca me he dado tiempo de actualizar el PDF, ya que hasta ahora ningún cliente, ni ningún cliente de mis clientes ha reclamado.

          1. Es una muy buena idea colocarlos en el objeto de informacion adicional, cheverisimo, muchas gracias.

          2. Estimado Jorgeluis, recientemente salio el nuevo proveedor de firmas uanataca, tal vez podrian actualizar el repo del gitlab agregando este proveedor o en todo caso, ayudarme con algunas «luces» o indicaciones para poder agregar un nuevo proveedor de firmas, gracias por tu respuesta, saludos desde Machala.

          3. Que tal jorge buen dia te comento que no tengo esa firma aun, es que recien estoy comenzando en este tema, ya vi el repositorio y el comentario ded youtube donde nos indicas que actualizaste el repo, ya le hice pull a mi repo local, y tengo los cambios donde veo que has agregado uanataca, eclipsfot y datil (cada dia salen mas proveedores que locura), voy a hacer unas pruebas a ver que resulta, gracias por tu aporte y actualizar el repo.

          4. Mi estimado jorgeluis, mi hmano le hice sacar con uanataca, y pude firmar sin problemas con la ultima actualizacion del repo, hasta el momento todo correcto.

  14. Hola, primero agradecerte todo el trabajo e información que haz puesto en este proyecto!, aún no he podido hacer el firmado :C , me sale error Exception in thread «main» java.lang.NullPointerException: Cannot invoke «String.toLowerCase(java.util.Locale)» because «alias» is null, mi certificado es de SECURITY DATA, el método que estoy ejecutando es:
    xadesBesFirma.sign(archivo,
    urlOutArchivo,
    PKCS12_RESOURCE,
    PKCS12_PASSWORD,
    TokensAvailables.SD_EPASS3000);
    la versión QuijoteLuiFirmador-2.4.jar
    si miro mi certificado con keystore explorer, sale en jerarquía del certificado
    AUTORIDAD DE CERTIFICACION RAIZ CA-2 SECURITY DATA
    -AUTORIDAD DE CERTIFICACION SUBCA-2 SECURITY DATA
    –«NOMBRE DUEÑO»
    Y versión 3, pongo toda esta info porque debería de poder firmar al solo ejecutar el que tiene TokensAvailables.SD_EPASS3000, pero igual me sale el error de alias null en java, estoy atascado :C

  15. Buenos días jorge, mi nombre es alvaro valverde soy un estudiante de la EPN y un desarollador, que utilizo tu código para la implementación de factura electrónica actualmente estoy tratando de firmar los xml que genero pero tengo el problema siguiente:
    Exception in thread «main» java.lang.NullPointerException: Cannot invoke «String.toLowerCase(java.util.Locale)» because «alias» is null
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetCertificate(PKCS12KeyStore.java:504)
    at java.base/sun.security.util.KeyStoreDelegator.engineGetCertificate(KeyStoreDelegator.java:101)
    at java.base/java.security.KeyStore.getCertificate(KeyStore.java:1108)
    at com.quijotelui.firmador.GenericXMLSignature.execute(GenericXMLSignature.java:140)
    at com.quijotelui.firmador.XAdESBESSignature.sign(XAdESBESSignature.java:72)
    at com.quijotelui.firmador.Main.main(Main.java:31)
    C:\Users\israv\AppData\Local\NetBeans\Cache\15\executor-snippets\run.xml:111: The following error occurred while executing this line:
    C:\Users\israv\AppData\Local\NetBeans\Cache\15\executor-snippets\run.xml:94: Java returned: 1
    BUILD FAILED (total time: 0 seconds)

  16. Buenos dias,
    Primero que nada muchas gracias a todos por compartir su conocimiento.
    He seguido este tutorial al pie de la letra para generar la firma electronica : https://www.jybaro.com/blog/firma-electronica-de-factura-electronica
    Pero el momento de probarlo en el ambiente de produccion del SRI recibo el mensaje:
    [identificador] => 39
    [mensaje] => FIRMA INVALIDA
    [informacionAdicional] => La firma es invalida [Firma inválida (firma y/o certificados alterados)]
    [tipo] => ERROR

    Lo he probado aqui : https://jsfiddle.net/dx5cbvf3/ , que es la url del sistema que la gente de Jybaro ha desarollado , y tambien lo he probado con mi sistema, pero en ambos casos obtengo ese error.

    Alguien sabe si existe algun problema con el tipo de hash que usa el SRI actualmente? Pregunto eso ya que en ese tutorial el hash se lo realiza en SHA1 y en el facturador en linea de SRI el hash usado es SHA256.

    Gracias por cualquier comentario

    1. Buen día. Ese error he obtenido cuando el archivo contiene tíldes y no lo guardo en UTF-8. Al momento de firmar y guardar considerando el UTF-8 ya no he tenido el problema, eso me solía pasar en windows. Espero puedas resolverlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *