Por petición de Obrian, vamos a firmar un comprobante desde PHP en Ubuntu con Apache.
- Es necesario seguir el tuturial para firmar un comprobante https://mestizos.dev/firmar-un-comprobante-electronico-segun-los-parametros-del-sri-en-ecuador/
- 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 xmlFile 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);
- Compilar el proyecto con el comando ant
- 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);
- Ejecutar el archivo index.php desde el navegador
- Verificar si se creo el archivo:
$ cd /var/www/html
$ ls
0401201901100645687700120011020000000151234567810.xml
index.php - El comprobante firmado está listo para ser enviado al SRI Ecuador
Si alguien lo intenta en windows, se agradece los comentarios si funciona. Saludos
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.
Hola Obrian, en windows tengo ese problema por el UTF8. Puedes probar configurando la variable de sistema de está manera -> https://www.allku.expert/java-utf8-windows/ o también puedes ejecutar el jar desde php -> «exec(‘java -Dfile.encoding=UTF-8 -jar ‘.$ruta_jar.’ param1 param2, $a, $b);» .
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;
}
}
}
Que buena idea.!!! Ya pronto escribo acerca del módulo 11
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
Hola, si usas el QuijoteLuiFirmador en windows, prueba con el JDK 8 de Oracle y configura el UTF8 con está guía.
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
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.
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
Saludos. En Mac o Linux es diferente, en lugar de:
"C:\\User\\admin\\Certificado"
sería:
"/user/admin/certificado"
Espero te ayude
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
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.
Saludos, de nada
Buenas tardes estimado, por favor como solucionaste el bug, de antemano agradezco la atención
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.
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);
Hola muchas gracias por el post, tengo un problema respecto al UTF-8 quisiera solucionarlo pero el link de referencia ya no existe https://www.allku.expert/java-utf8-windows/
Tal vez conocen otro post donde indique los pasos a seguir.
Hola, mira por favor en el siguiente enlace https://mestizos.dev/java-utf8-windows/
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
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.
Hola Wilian. Mira el enlace a ver si te ayuda en algo: https://stackoverflow.com/questions/31002612/java-hotspottm-64-bit-server-vm-warning