Facturae y tarjetas criptográficas (ceres / dnie)


Facturae (el programa de facturación, no el formato) funciona correctamente con tarjetas criptográficas, al menos con una ceres que tengo, que contiene dos certificados de la fnmt.

Funciona hasta la versión 3.1, porque la nueva versión 3.2 ya no lo hace (en linux, en Windows no he probado, pero me da que tampoco por lo que he visto: sigue leyendo...).

Y es una faena porque, según comentan aquí, a partir del 01/06/2015 parece ser que la validación de las facturas firmadas que se intenten presentar a través del FACE es más estricta, por lo que, sí o sí se tiene que usar esta última versión del programa, que es la que genera una firma correcta (acorde con la nueva norma).

Tanto las versiones anteriores a la 3.2 como las versiones del Gobierno de Canarias, (incluida la 1.5), no generarán una firma que valide en el portal: si se adjunta el .xsig y se intenta validar nos encontramos con un error " - La firma de la factura es incorrecta" (he probado con ges-pefac 1.4, 1.5 y Facturae 3.1)


Para usar la v3.2 lo único que podía hacer es instalar los certificados en el almacén de firefox, poner en barbecho el lector de tarjetas y esperar a tiempos mejores.

Pero ya que el código fuente de Facturae está disponible decidí echar un vistazo a ver si encontraba la causa.

Si ejecutamos Facturae desde consola encontramos que al intentar firmar una factura nos suelta algo como esto:
[DEBUG] MozillaKeyStoreUtilities --> Modulo /usr/lib/libpkcs11-fnmtdnie.so
[DEBUG] MozillaKeyStoreUtilities --> Saltado
En la versión anterior pedía el pin de la tarjeta. En esta salta directamente al diálogo de selección de certificados, que en mi caso está vacío ya que ni ha hecho por leer la tarjeta, ni tengo certificados en el almacén de firefox.

 ¿"Saltado"? Mirando en el código fuente y buscando "Saltado", en el fichero MozillaKeyStoreUtilities.java me encuentro con la línea 437:
 
public static Map<String, String> getMozillaPKCS11Modules(final boolean excludeDnie,
                                              final boolean includeKnownModules) {
...
     if (excludeDnie && isDniePkcs11Library(moduleLib)) {
             logger.debug("Saltado");
             continue;
     }
...
Por la pinta que tiene, parece que la exclusión del módulo de las tarjetas criptográficas no parece "accidental": depende del parámetro excludeDnie y del resultado de isDniePkcs11Library.

Con respecto a isDniePkcs11Library, buscamos y vemos lo que hace:
La línea 492, hace referencia a DNI_P11_NAMES, que en la línea 66 viene definido como
...
        private static final String[] DNI_P11_NAMES = new String[] {
                "libopensc-dnie.dylib", //$NON-NLS-1$
                "libopensc-dnie.so", //$NON-NLS-1$
                "usrpkcs11.dll", //$NON-NLS-1$
                "dnie_p11_priv.dll", //$NON-NLS-1$
                "dnie_p11_pub.dll", //$NON-NLS-1$
                "opensc-pkcs11.dll", //$NON-NLS-1$
                "libpkcs11-fnmtdnie.so", //$NON-NLS-1$
                "FNMT_P11.dll"
        };
...
Total, que si el módulo se llama como uno de los nombres del array de arriba, parece ser que entra en una especie de lista negra.

En cuanto a excludeDnie, tenemos que en la llamada a la función desde MozillaUnifiedKeyStoreManager.java línea 174:
...
    // Vamos ahora con los almacenes externos
    final Map externalStores = MozillaKeyStoreUtilities.getMozillaPKCS11Modules(true,true);
...
se le indica explícitamente que NO cargue los módulos del dnie (y por extensión, en mi caso también se incluyen las tarjetas ceres, donde tengo mis certificados)

Aunque los módulos que dan acceso al dnie están 'baneados' vamos a probar cómo funciona el programa si se fuerza la situación.
Decido probar con una "solución" improvisada: sacar el módulo de la lista negra cambiándole el nombre.
  cd /usr/lib
  cp libpkcs11-fnmtdnie.so libpkcs11-fnmtceresdnie.so

Quito de firefox el módulo de seguridad /usr/lib/libpkcs11-fnmtdnie.so y seguidamente agrego el módulo /usr/lib/libpkcs11-fnmtceresdnie.so, que repito, es el mismo pero cambiado a un nombre que no esté en la lista negra.

Profit!  Ahora Facturae me pide el pin de la tarjeta y acto seguido me muestra los certificados.
La salida de consola tiene ahora otra pinta:
[DEBUG] MozillaKeyStoreUtilities --> Modulo /usr/lib/libpkcs11-fnmtceresdnie.so
[DEBUG] MozillaKeyStoreUtilities --> Añadido
[DEBUG] MozillaKeyStoreUtilities --> Incluyendo módulos conocidos
[DEBUG] MozillaKeyStoreUtilities --> Buscando FNMT_P11.dll
[DEBUG] MozillaKeyStoreUtilities --> Buscando siecap11.dll
[INFO ] MozillaUnifiedKeyStoreManager --> Encontrados los siguientes modulos PKCS#11 externos instalados en Mozilla / Firefox: '/usr/lib/libpkcs11-fnmtceresdnie.so' 
[DEBUG] MozillaUnifiedKeyStoreManager --> p11provider:null
[INFO ] MozillaUnifiedKeyStoreManager --> Creada configuracion PKCS#11:
library=/usr/lib/libpkcs11-fnmtceresdnie.so
name=libpkcs11-fnmtceresdnie_so
showInfo=false

Firmo la factura y todos felices.

Todo parece funcionar correctamente, en lo que al uso de la tarjeta se refiere (como ya lo hacía en la 3.1 que, por cierto, parece utilizar otro método - MozillaStoreUtils en la 3.1 vs MozillaKeyStoreUtilities en la 3.2)

Entonces lo de 'banear' el módulo para el uso de tarjetas...
¿Por qué?
Vete a saber (¿da problemas?, ¿se puso por error true en la llamada de la función cuando la intención era poner false? ...)

No hay comentarios:

Publicar un comentario

Si te apetece comenta algo...

create PrestaShop themes