Firmar un comprobante con QuijoteLui Firmador desde PHP

Por petición de Obrian, vamos a firmar un comprobante desde PHP en Ubuntu con Apache.

  1. Es necesario seguir el tuturial para firmar un comprobante https://mestizos.dev/firmar-un-comprobante-electronico-segun-los-parametros-del-sri-en-ecuador/
  2. Se cambia el método main:

    public static void main(String[] args) {

    System.out.println("QuijoteLui Firmador");
    System.out.println("Java Version -> " + System.getProperty("java.version"));
    XAdESBESSignature xadesBesFirma = new XAdESBESSignature();

    //Ruta del archivo generado o archivo a firmar
    //La variable args[0] trae el nombre del archivo xml

    File archivo = new File("/data/BCE/IdeasEnBinario/"
    + args[0]);

    //Ruta donde se guardara el archivo firmado
    String urlOutArchivo = ".";

    //Ruta donde está el certificado digital

    String PKCS12_RESOURCE = "/data/BCE/IdeasEnBinario";
    String PKCS12_PASSWORD;

    String nombreP12 = "ideas_en_binario.p12";
    PKCS12_RESOURCE = PKCS12_RESOURCE + File.separatorChar + nombreP12;

    PKCS12_PASSWORD = new String("miclavedelafirma");

    xadesBesFirma.firmar(archivo.getAbsolutePath(), archivo.getName(),
    urlOutArchivo, PKCS12_RESOURCE, PKCS12_PASSWORD,
    TokensAvailables.BCE_IKEY2032);


  3. Compilar el proyecto con el comando ant
  4. Crear el archivo index.php en la carpeta de apache /var/www/html

    <?php


    exec("/app/jdk1.8.0_181/bin/java -Dfile.encoding=UTF-8 -jar /data/git/QuijoteLuiFirmador/dist/QuijoteLuiFirmador-1.3.jar 0401201901100645687700120011020000000151234567810.xml", $o); print_r($o);

  5. Ejecutar el archivo index.php desde el navegador
  6. Verificar si se creo el archivo:

    $ cd /var/www/html

    $ ls

    0401201901100645687700120011020000000151234567810.xml
    index.php

  7. El comprobante firmado está listo para ser enviado al SRI Ecuador

Si alguien lo intenta en windows, se agradece los comentarios si funciona. Saludos


21 thoughts on “Firmar un comprobante con QuijoteLui Firmador desde PHP

  1. Hola Jorge Luis muy bueno este post te felicito, y gracias por tu respuesta ya lo había logrado correr en Window bajo xampp lo único que cambia a mi parecer es en el php donde llamas al .jar, el mío quedó de esta forma:

    exec(‘java -jar ‘.$ruta_jar.’ param1 param2, $a, $b);
    dd($a);

    Donde $ruta_jar es la ruta donde queda el .jar despues de compilar con «ant»

    Te quería comentar que tambien tengo instalado ya QuijoteLuiClient sin problemas pero al momento de enviar el XML al SRI y luego de librarme de todas las validaciones del XML siempre me da el siguiente error:
    «La firma es invalida [Firma inválida (firma y/o certificados alterados)]»
    Cabe recalcar que el archivo firmado QuijoteLuiFirmador lo genera sin problemas pero por lo que veo esta sucediendo algo mal al momento de firmar el documento.
    En lo que me puedas ayudar en este tema te lo agradecería.

      1. Hola Jorge te comento que ya pude hacer los envíos de los xml al sri satisfactoriamente, solo tuve que utilizar el modulo firmador ya que para enviarlo logre hacerlo por mi cuenta, de nuevo muchas gracias por tu aporte y adicional también quería compartir una función que genera el dígito verificador con el modulo 11, según las especificaciones del sri por si es de ayuda para alguien ya que llegue a tu web igual que yo buscando, por la Internet vi que habían full personas preguntando como se lograba obtener y bueno este es mi pequeño aporte por si quieres hacer algún post con él.

        public function generaDigitoVerificador($cadena){
        $arr_num = str_split($cadena);
        $cant_cadena = count($arr_num);
        $total =0;
        if($cant_cadena===48){
        $x=2;
        for($i=47;$i>=0;$i–){
        $cantidad = $arr_num[$i] * $x;
        $total += $cantidad;
        $x++;
        if($x == 8)
        $x=2;
        }
        $cociente = $total/11 ;
        $producto = ((int)$cociente)*11;
        $resultado = $total-$producto;
        $digito_verificador = 11-$resultado;

        if((11*(int)$cociente)+$resultado === $total){
        if($digito_verificador == 10)
        $digito_verificador = 1;
        elseif($digito_verificador == 11)
        $digito_verificador = 0;

        return $digito_verificador;
        }
        }
        }

        1. Saludos, como pudiste resolver el error de La firma es invalida [Firma inválida (firma y/o certificados alterados)]
          Actualmente en encuentro con ese mismo problema y no logro dar con la solucion, me podriar guiar

  2. Buenas tardes Joge Luiz profa necesito tu ayuda el sistema esta bien tengo una duda requiero colocar la firma y que la factura se efectué en el sistema pero no logro hacerlo estoy trabajando con el sistema pero con pre facturas como puedo lograr colocar el firmado de el archivo y envío del mismo al sri gracias de antemano o si me puedes ayudar vía digital o en presencia por favor gracias de ante mano

  3. Buenas tardes, primero Agradecer a Jorge por su arduo trabajo, la explicación es correcta y el sistema me funciona perfectamente en php en localhost desde xampp, solo quisiera saber si alguien ya lo subio a algun host y como direcciono las rutas, no he podido ejecutarlo desde el servidor.

  4. Saludos cordial, de pronto alguien a trabajo en mac, las rutas cambian totalmente, se agradecería si hay alguien que me pueda guiar, no consiguido firmar el xml

  5. Ayuda cuando ejecuto
    java -jar QuijoteLuiFirmador-2.4.jar

    Archivo Firma P12: C:\xampp\htdocs\MssContableWeb\Comprobantes\FirmaElectronica\RONALD PATRICIO ACOSTA RODRIGUEZ 101122084438.p12
    Exception in thread «main» java.lang.NullPointerException
    at sun.security.pkcs12.PKCS12KeyStore.engineGetCertificate(Unknown Source)
    at java.security.KeyStore.getCertificate(Unknown Source)
    at com.quijotelui.firmador.GenericXMLSignature.execute(GenericXMLSignature.java:140)
    at com.quijotelui.firmador.XAdESBESSignature.sign(XAdESBESSignature.java:78)
    at com.quijotelui.firmador.Main.main(Main.java:37)

    Porfame ayudan

    1. Hola ya lo solucione estaba mandando todos los certificados.
      Voy Hcer el siguiente paso
      Jorge Mil Gracias por el tiempo que te tomas para hacer estos videos.

      1. Saludos, revise la guía video y web , pero llego al mismo error :
        Exception in thread «main» java.lang.NullPointerException: Cannot invoke «String.toLowerCase(java.util.Locale)» because «alias» is null

        Como se podria solucionar, mi entidad emisora es UANATACA.
        De antemano , Gracias a todos por sus ideas.

        1. Saludos Diego. Prueba por favor con el último parámetro TokensAvailables.TOKENME_UANATACA, eso no está en el vídeo se añadió posteriormente.
          /*
          Para firmar con un certificado emitido por Uanataca Ecuador S.A.
          */
          xadesBesFirma.sign(archivo,
          urlOutArchivo,
          PKCS12_RESOURCE,
          PKCS12_PASSWORD,
          TokensAvailables.TOKENME_UANATACA);

  6. Buenas tardes verdaderamente muy util , solo tengo una duda, tal vez alguien ha logrado extraer de la firma del Banco Central los datos del firmante ? es decir su cédula/RUC y los nombres y apellidos ? . He estado debbugeando pero no logro encontrar el objeto que tiene esa información, lo que si he logrado es traer la entidad certificadora y las fechas de vigencia de la firma.

    Quedo muy agradecido a cualquier ayuda que me puedan brindar

  7. Saludos, con todos.
    Estoy ejecutando desde el sevidor php el programa firmador, pero me sale un error. El problema surge cuando desde php ejecuta el jar.

    MENSAJE ERROR:

    Array ( [0] => Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007fea91000000, 2555904, 1) failed; error=’Permission denied’ (errno=13) [1] => # [2] => # There is insufficient memory for the Java Runtime Environment to continue. [3] => # Native memory allocation (mmap) failed to map 2555904 bytes for committing reserved memory. [4] => # An error report file with more information is saved as: [5] => # /tmp/hs_err_pid3326.log )

    Todo funciona en windows, y también el firmador desde el terminal de centos.
    Alguna sugerencia.

Deja una respuesta

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