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

Firma no válida Camerfirma #17

Open
isjhdenu opened this issue Jul 15, 2019 · 10 comments
Open

Firma no válida Camerfirma #17

isjhdenu opened this issue Jul 15, 2019 · 10 comments

Comments

@isjhdenu
Copy link

Al firmar una factura electrónica con un certificado clasificación 8 (sello cualificado de entidad) y 11 de la autoridad camerfirma, la librería genera un fichero que autofirma dice que es válido, pero las webs de Valide y FACe no aceptan por firma incorrecta.

He probado a importar la factura en el programa facturae y firmar con los mismos certificados. El resultado sí pasa los tests de las webs anteriores. La única diferencia que se aprecia visualmente (aparte de los digests y la signature) es el campo x509issuername.

@JMLOSP
Copy link

JMLOSP commented Feb 6, 2020

@isjhdenu Buenos días, ¿llegaste a solventar este problema?

Gracias.
Saludos

@isjhdenu
Copy link
Author

isjhdenu commented Feb 6, 2020

Esta es la respuesta recibida por parte de responsables de @firma.

Se ha comprobado el proceso de verificación que sigue la firma remitida contra el entorno de Producción de la plataforma @firma y ha sido posible reproducir el comportamiento detectado (se adjuntan las trazas de log correspondientes al proceso de validación). El problema de validación de la firma reportada está relacionado con la generación de la firma XAdES B-Level en la que el valor contenido en el elemento <ds:X509IssuerName /> es incorrecto ya que éste incluye el atributo stateOrProvince "S" que no es conforme a la norma definida en el estándar RFC 2253 (norma técnica definida en https://tools.ietf.org/html/rfc2253, apartado "2.3. Converting AttributeTypeAndValue"): ds:X509IssuerNameCN=AC CAMERFIRMA FOR LEGAL PERSONS - 2016, O=AC CAMERFIRMA S.A., OID.2.5.4.97=VATES-A82743287, SERIALNUMBER=A82743287, OU=AC CAMERFIRMA FOR LEGAL PERSONS - 2016, OU=see current address at https://www.camerfirma.com/address, S=MADRID, L=MADRID, C=ES</ds:X509IssuerName> No obstante, la validación del certificado firmante resulta correcta en @firma y dicho atributo es mapeado correctamente (ST=MADRID) en la Plataforma. Entendemos, por tanto, que el problema se encuentra localizado en el aplicativo que trata la generación de firmas de facturas desde el entorno del emisor de las mismas, como parece corresponderse con el caso expuesto en la presente incidencia.

En un entorno windows el atributo que genera para stateOrProvince es "S" y no "ST", por lo que no hay solución.

@JMLOSP
Copy link

JMLOSP commented Feb 6, 2020

@isjhdenu Muchas gracias por tomarte un momento en contestarme.

Por lo que veo según la librería de FirmaXades lo que se hace es trasladar el atributo Name del certificado al valor de la firma del nodo X509IssuerName.

Entiendo que afirma lo que hace es manipular ese valor para que ponga ST y no ponga la S que viene del certificado de CamerFirma. ¿Correcto?

¿Llegaste a hablar con CamerFirma para saber si están generando estos certificados de forma correcta?

Muchas gracias por todo.
Saludos.

@isjhdenu
Copy link
Author

isjhdenu commented Feb 6, 2020

@JMLOSP El problema está en la interpretación del oid de stateOrProvince por el sistema operativo windows.

La librería de FirmaXades, para generar el nodo "x509issuername" en el xml, hace uso de un librería de .net framework que mapea el oid de stateOrProvince y lo representa con el atributo S. El mismo error ocurre cuando visualizas el certificado desde el visor del sistema operativo (certmgr.msc).

Camerfirma al emitir el certificado incluye el oid y no su representación de texto.

Si ese certificado lo visualizamos con alguna herramienta de linux o java, ese atributo se mapea correctamente con ST (como indica el RCF 4514 que deja obsoleto el 2253)

Un saludo.

@rasputino
Copy link

Si he entendido el problema bien, indicáis que en en una firma realizada por factura-e en el siguiente nodo:
<ds:X509IssuerName>CN=AC FNMT Usuarios,OU=Ceres,O=FNMT-RCM,C=ES</ds:X509IssuerName>

Si está firmado con camerfirma el contenido debe tener un aspecto diferente en firmaxadesnet y en factura-e, no? Si fuera así, ¿podrías pegar un ejemplo de ambas? No dispongo de firma de camerfirma

@JMLOSP
Copy link

JMLOSP commented Feb 15, 2020

@rasputino El issuerName depende del certificado, en el caso de las firmas de la FNMT como indicas no existe el componente ST con lo cual no existe este problema, en cualquier otro certificado como el de camerfirma para personas físicas si que existe, Windows lo interpreta como que el nodo es "S" cuando en realidad debería ser "ST" de esta forma independientemente de cómo generes la firma siempre estará errónea si el origen del certificado es un Sistema operativo Windows.

En nuestro caso y gracias a toda la información que facilitó @isjhdenu hemos podido solventar el problema firmando a través de JAVA en vez de a través de la librería de .Net , JAVA por su propio funcionamiento interpreta el certificado correctamente y genera la firma sin incidencias.

No es la solución idónea pero nos permite solventar los problemas para estos tipos de certificados ya que como se indica en este hilo no hay solución a la interpretación errónea de este certificado.

@isjhdenu
Copy link
Author

Otra solución poco elegante es guardar el fichero original en el sistema de archivo, invocar el ejecutable de autofirma y leer el fichero firmado.

@dnturbanismo
Copy link
Collaborator

dnturbanismo commented Feb 15, 2020 via email

@lespinosajuan
Copy link

Buenas tardes!!

habeis conseguido con esta librería que Factura-e os valide el XML firmado con un certificado de FNMT??

No consigo que me valide la firma.

GRACIAS

@jromerus
Copy link

Como bien han comentado, las autoridades de certificación suelen indicar el texto del atributo tal y como recomienda el estándar RFC 2253, en este caso debería ser "ST", pero Camerfirma pone el OID 2.5.4.8 para stateOrProvinceName que efectivamente debería ser "ST". Microsoft por su parte analiza la cadena esperando en principio el texto, pero si encuentra el OID lo mapea erróneamente por "S" según se ve en la siguiente tabla.

La solución consiste en aplicar un pequeño parche. La forma más sencilla y rápida que he encontrado es modificar la clase Microsoft.Xades.IssuerSerial y en el método LoadXml línea 126:

//this.x509IssuerName = xmlNodeList.Item(0).InnerText;
this.x509IssuerName = xmlNodeList.Item(0).InnerText.Replace(", S=", ", ST=");

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

No branches or pull requests

6 participants