josemmo / Facturae-PHP

📝 Genera, firma, envía y recibe facturas electrónicas sin necesidad de ninguna librería adicional
https://josemmo.github.io/Facturae-PHP/
MIT License
218 stars 97 forks source link

Estado del certificado desconocido #97

Closed JoomBall closed 2 years ago

JoomBall commented 2 years ago

Buenas...

Gracias por este gran aporte!

Tengo un certificado electrónico expedido por la FNMT desde febrero y utilizando esta librería para enviar facturas de una empresa con éxito durante 5 meses.

Desde ayer dejo de funcionar el envio de facturas por culpa del certificado (Sin especificar error) pero este esta Válido y no revocado. Comprobado en https://www.sede.fnmt.gob.es/certificados/persona-fisica/verificar-estado/solicitar-verificacion

FNMT

// SIGNATURE $fac->sign(PATH . "/certificate.pfx", null, "CONTRASEÑA"); Este es el código que añado para adjuntar archivo.

No entiendo que puede haber pasado, ¿Alguna idea? Uso Facturae-PHP V1.7.0

Es muy urgente para mi, Muchas gracias!!

Adjunto imagen resultado Facturae sin especificar estado certificado:

Facturae

josemmo commented 2 years ago

Hola @JoomBall,

¿Con "dejó de funcionar" te refieres a que un punto de entrada de facturas no aceptó el documento? Si es así, ¿cuál? ¿FACe?

En la captura de pantalla que adjuntas, el validador del Gobierno de España indica que la factura es correcta (firma incluida). El mensaje "Estado del certificado desconocido" es porque el validador no es capaz de determinar si el certificado firmante ha sido revocado, pero eso no vuelve a la factura incorrecta. Es más, este mensaje es muy habitual que aparezca en este validador.

JoomBall commented 2 years ago

Hola @josemmo , gracias por contestar tan pronto.

"dejó de funcionar" en el mismo día, la primera factura se envio correctamente y las siguientes devolviendo.

¿cuál? ¿FACe? No, Comunidad de Cataluña eFact https://efact.aoc.cat/bustia/home.htm?siteLanguage=es y el error que me devuelven es:

HV01 | Error al verificar firma/certificado | La factura no ha superado la validación del certificado digital del emisor (certificado caducado o no reconocido) o no ha podido validarse la firma electrónica de la factura (su formato no es correcto). | Revisa que el campo SigninTime del XML contenga la hora de firma de la factura sin ningún número o carácter extraño. Si ves por ejemplo un +2 o una Z es necesario rehacer la firma de la factura y enviarla de nuevo. Si no hay nada que altere este campo, es necesario revisar el certificado utilizado para la firma de la factura a través del Signasuite.

Puedes ver error HV01 en https://suport-efact-empreses.aoc.cat/hc/es-es/articles/4415512586257-Principales-c%C3%B3digos-de-error-de-rechazo-t%C3%A9cnico-del-servicio-e-FACT

"Estado del certificado desconocido" Yo creo que este mensaje antes no me salía.

josemmo commented 2 years ago

Sin ver el documento XML de la factura no te sabría decir con total seguridad cuál es el problema.

Lo más probable es que, si el validador del Gobierno da la factura por válida, el problema lo tenga el punto de entrada de facturas al que lo estás mandando. Para confirmarlo, he probado a subir una factura correctamente firmada (pasa la validación del validador del Gobierno, de FACe y de AutoFirma) al validador del Consorci AOC (la entidad que mencionas) y dice que es incorrecta.

En este enlace tienes la factura que he utilizado.

JoomBall commented 2 years ago

Gracias @josemmo

Tampoco llego a entender el problema: ¿Puede ser por el tipo de certificado? el mio es como persona física y el tuyo como Persona física representante ante las AAPP de entidad sin pe ..

El mio lo utilizo como proveedor de plataforma y así poder enviar facturas de otras empresas pero tampoco tiene sentido ya que funcionaba bién hasta ahora.

Te adjunto ejemplo XML ~FacturaEjemplo.zip~

EDIT @josemmo: Eliminado adjunto por ser una factura real con información personal.

A ver si encuentras un problema. Mientras a parte de https://www.sede.fnmt.gob.es/certificados ¿sabes dónde emiten en otro sitio certificados?

josemmo commented 2 years ago

@JoomBall, la factura que has subido es correcta: pasa la validación del validador del Gobierno de España, de FACe y de AutoFirma. Insisto en que tu certificado tampoco es el problema.

Te recomiendo que te pongas en contacto con efact.aoc.cat ya que parece un problema suyo.

Al principio pensaba que el problema era que el digest de firma que usa Facturae-PHP es RSA-SHA1, que desde hace un tiempo se considera obsoleto y tengo pensado cambiar en breve por RSA-SHA256 (no lo he hecho todavía por compatibilidad con plataformas públicas pendientes de adaptación).

Sin embargo, la factura de prueba que utilicé con el validador del Consorci AOC usa RSA-SHA256 y tampoco la da por válida, así que ni idea de qué está pasando.

JoomBall commented 2 years ago

@josemmo , gracias por todo de verdad, al menos me das pistas.

Ayer envie email a AOC preguntando, te contaré si obtengo respuesta.

He vuelto a pasar tu factura y la mia por el validador del Consorci AOC y me da el mismo error Resultat: urn:oasis:names:tc:dss:1.0:resultminor:invalid:incorrectSignature

Si buscas en Google, la respuesta que he encontrado sobre este error són:

El sello de tiempo no es correcto. La firma o sello de tiempo es válido. Sin embargo, la firma o el sello de tiempo no cubre todos los documentos de entrada que entregó el cliente.

Aunque tal vez es: La firma no se verifica, por ejemplo, debido a que se modificó el documento firmado o se usó una clave incorrecta.

Visto en https://docs.oasis-open.org/dss/v1.0/oasis-dss-core-spec-v1.0-os.html.

Quizás sepas qué significa.

JoomBall commented 2 years ago

Hola de nuevo @josemmo , al final despúes de una dura batalla he obtenido respuesta de AOC sobre el problema.

Al final viene de la etiqueta SigninTime, esta es la respuesta de ellos:

Hemos revisado este 131280868 y el error és: VALIDATE.ERRORDESC=Firma inválida. La fecha contenida en la firma es posterior a la actual És el SigningTime: 2022-09-14T09:44:49+00.00 En España usamos la franja horária +2 en verano (+1 en invierno en cambiar la hora) no la 00.00, y han subido la factura a las 14.09.2022 11.39 (és decir la signatura és 5 minutos posterior a la subida, si sumamos estas 2 horas). La hemos subido a PRE: 1312823 y no ha dado error. Si suben este mismo fichero ahora, no debería de dar este error.

Entiendo que al subir la factura en el servidor de eFact la fecha no coincide con la de la Firma SigningTime.

Yo antes de esa respuesta probé cosas:

$fac->setSignTime(JFactory::getDate('+2hour')->toSql()); // En principio no me funciono

Ya que en tu código: '<xades:SigningTime>' . date('c', $signTime) . '</xades:SigningTime>' siempre da <xades:SigningTime>2022-09-14T12:53:46+00:00</xades:SigningTime>

En fin que el resultado supongo es el mismo hacer: <xades:SigningTime>2022-09-14T14:53:46+00:00</xades:SigningTime> <xades:SigningTime>2022-09-14T12:53:46+02:00</xades:SigningTime>

¿Qué puedo hacer? o tengo que realizar las pruebas con $fac->setSignTime();

Muchas gracias!

josemmo commented 2 years ago

Hola @JoomBall,

Gracias por la actualización.


Al final viene de la etiqueta SigninTime, esta es la respuesta de ellos:

Lo que te dicen de la zona horaria (el "+00:00") es bastante absurdo. La especificación oficial de XAdES del W3C no dice nada de que cada país tenga que usar su propia zona horaria. Es más, el incluir el offset horario con la fecha está pensado para poder verificar la firma de facturas entre países con zonas horarias distintas y que no haya lugar a confusión.


¿Qué puedo hacer?

Primero, comprueba que la máquina desde la que estás generando la factura tiene fecha y hora correctas, no vaya a ser que el problema sea que el reloj esté adelantado.

Segundo, si quieres que Facturae-PHP genere un <xades:SigningTime /> con un offset horario concreto, cambia la zona horaria de PHP. Lo puedes hacer añadiendo esta línea al principio de tu script:

date_default_timezone_set('Europe/Madrid');
JoomBall commented 2 years ago

Hola @josemmo ,

Puedes cerrar este incidente, primero rebaje 5 minutos el horario y parece que funciona correctamente. Ahora he podido modificar el horario correcto en servidor y supongo que ya no me dará más problemas, de momento no tengo facturas para enviar.

Muchas gracias por todo, esta librería funciona muy bien.

Tal vez seria otra incidéncia pero comentarte algo que no he visto en documentación, es la posibilidad de añadir cantidades 1,50 (1 y medio, etc).

Esto funciona: $fac->addItem($product['text'], $product['total'], 1,50, Facturae::TAX_IVA, $product['vat']);

Esto no funciona: $fac->addItem(new FacturaeItem([ "name" => $product['text'], "unitPriceWithoutTax" => $product['base'], "quantity" => 1,50, "taxes" => [Facturae::TAX_IVA => $product['vat']] ]));

Tal vez hay que añadir comillas...

josemmo commented 2 years ago

De acuerdo, @JoomBall. Gracias a ti por notificar la incidencia.

Sobre los decimales, tienes que utilizar "." en vez de "," como separador:

// Opción A
$fac->addItem($product['text'], $product['total'], 1.50, Facturae::TAX_IVA, $product['vat']);

// Opción B
$fac->addItem(new FacturaeItem([
  "name" => $product['text'],
  "unitPriceWithoutTax" => $product['base'],
  "quantity" => 1.50,
  "taxes" => [Facturae::TAX_IVA => $product['vat']] ]
));