Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
wants to merge 31 commits into from
Closed

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

wants to merge 31 commits into from

Conversation

demoler
Copy link

@demoler demoler commented Oct 31, 2023

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 and others added 30 commits April 28, 2018 20:26
Actualizado certificado webservices
@josemmo
Copy link
Owner

josemmo commented Nov 1, 2023

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 demoler changed the base branch from master to develop November 2, 2023 11:26
@demoler
Copy link
Author

demoler commented Nov 3, 2023

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:

  • Descarga el certificado de prueba de Uanataca mediante el siguiente enlace.
  • Una vez obtenido el certificado, firma una factura electrónica con tu proyecto FacturaE.
  • Cuando tengas la factura firmada con el certificado de Uanataca, accede a la web de Face para validarla (importante marcar las opciones de validación "Formato Facturae" y "Firma de la factura" ).

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
Copy link
Owner

josemmo commented Nov 4, 2023

Hola @demoler,

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

josemmo added a commit that referenced this pull request Nov 12, 2023
- Actualizada clase FacturaeSigner

> Related to #143
josemmo added a commit that referenced this pull request Nov 12, 2023
- Actualizada clase FacturaeSigner para añadir compatibilidad con PHP 5.6

> Related to #143
@josemmo
Copy link
Owner

josemmo commented Nov 12, 2023

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
Copy link
Author

demoler commented Nov 13, 2023

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
Copy link
Author

demoler commented Nov 14, 2023

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
Copy link
Owner

josemmo commented Nov 15, 2023

Genial, gracias por la confirmación!

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

@josemmo josemmo closed this Nov 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants