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
219 stars 98 forks source link

Corrección de atributos no estándar en la firma de certificados. #143

Closed demoler closed 11 months ago

demoler commented 1 year ago

Título:

Corrección de atributos no estándar en la firma de certificados.

Descripción:

Se ha detectado un problema en el proceso de firma con certificados que presentan campos no estándar en el issuer, como es el caso de organizationIdentifier. Para abordar este problema y asegurar la correcta firma de facturas, se ha introducido una corrección que reemplaza automáticamente estos campos por su equivalente estándar.

Detalles Técnicos:

Se ha añadido una constante REPLACE_NON_STANDARD_FIELDS en la clase responsable de la firma, que mapea los campos no estándar a su correspondiente valor estándar:

public const REPLACE_NON_STANDARD_FIELDS = ['organizationIdentifier' => 'OID.2.5.4.97'];

Posteriormente, en el proceso de construcción del issuer del certificado, se ha incorporado una verificación que busca estos campos no estándar y los reemplaza según la constante definida:

foreach ($certData['issuer'] as $item => $value) {
    if (array_key_exists($item, self::REPLACE_NON_STANDARD_FIELDS)) {
        $item = self::REPLACE_NON_STANDARD_FIELDS[$item];
    }
    $certIssuer[] = "$item=$value";
}

Justificación:

La incorporación de esta lógica asegura que los certificados con atributos no estándar, como los provenientes de Uanataca, sean tratados adecuadamente, evitando problemas en el proceso de firma. Esta modificación mejora la robustez y la compatibilidad de la librería al manejar diferentes tipos de certificados.

josemmo commented 1 year ago

Hola @demoler,

Gracias por tu contribución.

Antes de nada, te recuerdo que los pull request deben ir siempre a la rama develop como se indica en CONTRIBUTING.md.

El atributo "organizationIdentifier" (2.5.4.97) sí que es estándar y está definido en el ITU-T X.500 (10/2019) y contemplado en eIDAS. Entiendo que con "no estándar" te refieres a que hay implementaciones (como Autofirma) que exportan el OID en vez del nombre del atributo.

Me gustaría comprender mejor el problema antes de hacer cambios que se desvían de la especificación para favorecer retrocompatilidad. ¿Hay algun validador en concreto para el cual tengas problemas a la hora de subir una factura firmada con Facturae-PHP?

demoler commented 1 year ago

Hola @josemmo!

Primero de todo agradecerte el feedback y tu tiempo. Para entender el motivo de la propuesta ofrecida te propongo que realices una prueba muy sencilla firmando una FacturaE con un certificado expedido por Uanataca. Pasos a seguir:

Verás que el resultado de la validación no es correcta debido a la firma del documento. Qué diferencia existe con otras entidades emisoras de certificados? Que el issuer type usa organizationIdentifier y este no es reconocido como un tipo válido. En cambio, si usamos OID en su lugar, esta es aceptada y validada correctamente.

josemmo commented 1 year ago

Hola @demoler,

En el enlace que mencionas solo encuentro certificados sin clave privada. Con eso no puedo firmar un documento.

josemmo commented 11 months ago

Hola @demoler,

He añadido unos cambios a la rama develop que (creo) solucionan el problema:

composer require josemmo/facturae-php:dev-develop

Como no puedo probarlo al 100% porque no dispongo de un certificado válido con clave privada, por favor, prueba a reproducir el fallo y me cuentas.

demoler commented 11 months ago

Hola @josemmo,

Primero de todo pedirte disculpas por la confusión y la respuesta tardía a tu mensaje. Respecto a los cambios que has realizado en la branch de develop, intento darte una respuesta mañana o lo más tardar el miércoles.

Un saludo.

demoler commented 11 months ago

Hola @josemmo ,

He realizado la prueba y te confirmo que con el cambio que has añadido en la branch develop el issue queda solucionado. He verificado que en la web de Face valide correctamente la factura con la firma. Estaré pendiente de ello para cuando sea introducido en master. Muchas gracias por el cambio.

Un saludo.

josemmo commented 11 months ago

Genial, gracias por la confirmación!

Doy por cerrado el issue, en la próxima release estará solucionado el fallo.