-
Notifications
You must be signed in to change notification settings - Fork 98
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
Validación FACe La "firma de la factura es incorrecta" #175
Comments
Hola @Jasmsan me pasa algo similar con un certificado de ANF AC. En mi caso da el error la política de firma no es correcta. Y dependiendo del certificado con el que pruebe también que la firma de la factura es incorrecta. Nuestro aplicativo estuvo funcionando con un certificado de FMNT pero caducó y nos proporcionaron otro de ANF AC, He estado consultando con la entidad certificadora y ellos me aseguran que el certificado es valido y que tiene capacidad de firmar. Pero al validar la factura en la página de FACe salta el error de que la política de firma es incorrecta. Aún así hice un script para ver el contenido del certificado para compararlo con el de FMNT y no sé, si afecta a algo pero veo que el certificado nuevo no tiene relleno el valor smimeencrypt en los purposes y en los certificados viejos si lo lleva relleno a 1. También veo un valor en el certificado viejo: [certificatePolicies] => Policy: 1.3.6.1.4.1.5734.3.11.1 y en el nuevo pone esto: [certificatePolicies] => Policy: 1.3.6.1.4.1.18332.2.5.1.9 Cambian las políticas parece ser. Desde ANF me comentaban primero lo siguiente: "Según me ha comunicado el departamento de desarrollo, como usted bien ha indicado es muy probable que se deba a las políticas, pero a nosotros no nos es posible cambiarlas," y me instan a " No tengo tan claro que sea un problema del código fuente y ya dudo si es un problema con los certificados, no se si desde FACe habrán cambiado algo en las políticas. Inspeccionando un poco el código fuente de la librería, veo que cuando se llama a $fac->sign ... vei que se utiliza esta constante:
Sin embargo esa URL si la cargas parece que redirige a otra : https://www.facturae.gob.es/formato/Polticasfirma/A)%20Versi%C3%B3n%203.1/Politica_Firma_formato_facturae_v3_1.pdf También veo que por defecto el SCHEMA_3_2_1 para el formato y el ultimo parece ser el SCHEMA_3_2_2 => https://www.facturae.gob.es/formato/Paginas/version-3-2.aspx Lo que es la política de firma si que veo que en FACe https://www.facturae.gob.es/formato/Paginas/politicas-firma-electronica.aspx sale la 3.1 como la última y es la que trae la librería SIGN_POLICY_3_1 así que no sé por donde puede ir el fallo realmente, si es que FACe ha cambiado algo y tenemos que actualizar código o son los certificados. A ver si @josemmo puede arrojarnos algo de luz al respecto. Saludos. |
Hola @Jasmsan, ¿Puedes pasar la factura generada y firmada con la libraría que da problemas? Y también esa misma factura generada por la librería pero firmada con AutoFirma. No entiendo por qué haces la conversación de encoding en algunos strings, debería ser todo UTF-8. |
Hola @aolmosg, La política de firma de FacturaE viene definida en la especificación y no se puede cambiar. Es un concepto distinto a las policies que aparecen en un certificado. Lo que significan esos números o OIDs viene en este documento: https://administracionelectronica.gob.es/PAe/aFirma-Anexo-PSC |
Hola @josemmo, El fichero fac6111_signed.xsig está generado y firmado con la librería. // No pasa la validación de firma de FACe |
Hola @aolmosg, Puedes tratar de usar la aplicación de AutoFirma a ver si firmando con el mismo certificado pasa la validación del FACe (sólo para descartar que el problema sea el certificado). |
Buenos días, XXXXXXXX sustituir por Si estoy en lo incierto ruego me disculpéis. |
Buenas @josemmo , gracias por responder. Parece ser que en mi caso estaba usando una versión antigua de la librería (1.4.2) Fallo mío. He probado a instalarme la última versión 1.8.1 y la he hecho funcionar en PHP 5.6 con OpenSSL 3.0.2, me genera la factura y la firma, pero ahora me pasa como al compañero @Jasmsan, me salta el error "La firma de la factura es incorrecta" cuando intento validarla en https://face.gob.es/es/facturas/validar-visualizar-facturas . Si marco sólo formato Facturae me sale correcto. El problema es que la web de Face te dice el error pero no te dice "porqué" y vamos a ciegas. Siguiendo el consejo de @Jasmsan me he instalado el programa de autofirma, como mi aplicativo me genera directamente el fichero .xsig y no el xml, he cogido y le he quitado manualmente el nodo ds:Signature al fichero .xsig y lo he guardado como .xml . Después mediante el programa de autofirma lo he firmado con el mismo certificado y entonces la web de FACe si me valida certificado y firma. Por lo que descartamos que sea problema del certificado, algo hace el programa de autofirma diferente a la librería. Desde autofirma, si abro el fichero firmado con la libería, tiene un visor y dice: "Los datos contenidos o referenciados en la firma no se corresponden con los datos firmados" Adjunto por si sirve de algo mis dos archivos: facturas_facturae_autofirma.zip Facturae_f_3363 (3) .xml_signed_autofirma.xsig => Firmado con autofirma y valida en FACe Un slaudo y mMuchas gracias. |
Hola chicos, La configuración que se debe realizar en el fichero
En éste link tenéis más información https://www.php.net/manual/en/function.openssl-pkcs12-read.php#128941 Procedo a cerrar el issue! Saludos. |
Buenas @Jasmsan , El problema con el OpenSSL 3 lo tuve, pero lo que sucedía con el legacy desactivado es que la función
No era capaz de desencriptar el certificado y saltaba un error. (Mi certificado es un .pfx certificado por ANF AC) Estuve cambiando la configuración del legacy del OpenSSL, para activar el legacy precisamente con las opciones que indicas, ya que tenemos acceso al servidor como root. Me hice un archivo de test con la función loadPkcs12($storeOrCertificate, $passphrase) modificada con print_r() para ver simplemente si el servidor era capaz de decodificar el certificado y extraer el contenido de las claves. Con el legacy desactivado saltaba un error, con el legacy activado decodificaba todo. Es decir el OpenSSL solo interfería en la decodificación del certificado, y al no poder decodificarlo no se podía firmar, pero una vez activado el legacy, ya se decodifica y se firma, pero FACe dice que la firma no es válida. la versión que tengo corriendo de openssl con php 5.6: Creo que lo del legacy era un problema adicional, cuando me pasó lo que sucedía era que el archivo .xsig se generaba sin la firma al no poder decodificar el certificado, y claro al no tener firma no validaba. Pero activando lo del legacy ya se firma, lo que no sé porque no valida. Son problemas diferentes parece ser. Si edito ambos ficheros .xsig, el firmado con autofirma y el firmado con la librería, la diferencia que veo es el nodo de la firma, pero no soy capaz de saber por dónde van los tiros. Veo que cuando se inserta el certificado desde la librería está en formato "pretty" y en autofirma parece todo seguido sin \n. También veo que parece que utiliza otro método, en autofirma el nodo ds:Signature tiene => xmlns:ds="http://www.w3.org/2000/09/xmldsig#" y con la librería xmlns:xades="http://uri.etsi.org/01903/v1.3.2#". El signatureMethod también es diferente en autofirma <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> y con la librería <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"></ds:SignatureMethod> Adjunto captura (tabulado para que se pueda ver) a la izquierda autofirma y a la derecha la librería. Supongo que esto será normal hasta cierto punto si utilizan métodos diferentes de firmado pero realmente no sé por donde puede estar el fallo. Adicionalmente si abro en autofirma el fichero firmado con la librería dice que "los datos contenidos o referenciados en la firma no se corresponden con los datos firmados" Un saludo y muchas gracias. |
Hola @aolmosg, En el ds:Signature me lo ha generado con lo siguiente: Y en el ds:SignatureMethod lo siguiente: O sea, creo que son las mismas que tienes tú y la factura que estoy mirando está validada por FACe. Creo que por allí no van los tiros. Saludos. |
Hola @aolmosg, Necesitas añadir todos los certificados de la cadena de certificación para que la firma de la factura pueda validarse correctamente (consulta este enlace de la documentación para más información). En la factura que firmas con Facturae-PHP, solo aparece un nodo de |
Hola @josemmo, creo que no es el caso, en la factura firmada con Facturae-PHP me aparecen los 3 nodos de Seguiré mirando a ver si lo saco. Saludos. |
Hola @aolmosg, Creo que estáis hablando de fallos distintos. En el caso de @Jasmsan (que es quien ha abierto el issue), estoy seguro de que no está incluyendo toda la cadena de certificados. En tu caso, el hash del nodo |
Hola @josemmo , Te adjunto el código fuente que uso para generar la factura, verás que hay datos que vienen de variables: `// Creamos la factura
Adjunto también una factura exportada con Facturae-PHP sin firmar. Saludos. |
Hola @josemmo , ¿pudiste ver algo con la factura sin firmar? Un saludo y gracias. |
- Actualizada clase FacturaeSigner - Actualizados tests unitarios > Relacionado con #175
Hola @aolmosg, Parece que el problema estaba relacionado con los saltos de línea. Tienes varios retornos de carro ( He añadido un fix a la rama
|
Hola @josemmo , ¡Pues ahora si funciona! me valida tanto el formato como la firma en la web de FACe. Veo que le has quitado los \r en la función de firma Muchísimas gracias!. |
Hola, obtengo el error "La firma de la factura es incorrecta" cuando trato de validar la firma de una factura que se ha generado y firmado con la librería (he usado un certificado de pruebas del FNMT).
¿Puede ser que estoy pasando algo por alto al momento de firmar el fichero?
He probado sólo generar la factura sin la firma y la estructura es correcta según el validador de FACe, e incluso he podido firmar la factura mediante la aplicación de AutoFirma (con el mismo certificado).
El código que he utilizado es el siguiente:
Muchas gracias!
Saludos!
The text was updated successfully, but these errors were encountered: