Firma Digital / Applet: Drivers del token en linux

Hola:
Probando el applet “firmador.jar” en el Toba_referancia > Generales > Firma Digital > Firma Digital - Componente Toba sobre ,
plataforma Kubuntu 12.04 y browser Firefox 24, veo que el applet no puede encontrar el driver del token.

Urgando en el firmador.jar en el archivo: properties/providers-linux.properties , encontre que no había nada, y en properties/providers-windows.properties lo siguiente

   eToken=c:\\windows\\system32\\eTPKCS11.dll            <-(estimo que es para el eToken Aladin)
   ASECard=c:\\windows\\system32\\asepkcs.dll

Una posible solución sería incluir en properties/providers-linux.properties los paths del archivo libASEP11.so, quedando algo así:

   Athena1=lib64/libASEP11.so
   Athena2=lib32/libASEP11.so
   eToken1=lib34/libeToken.so.8
   eToken2=lib32/libeToken.so.8

O bien alguna otra manera de ubicar dichas librerías de manera mas genérica…

Hola Luis,

puntualmente no estoy en el tema del firmador… pero quisiera creer que la forma mas generica seria que el driver quede registrado en el S.O. y a partir de ahi se levante mediante API.

En el caso de windows se que esta usando la CryptoAPI de MS para todo lo relacionado al acceso al token.

En linux, no sabria decirte… Seba te va a poder orientar mejor seguro.

Saludos

Gracias richard, la otra es que consulte los paths configurados en un archivo externo, se me ocurre…

Hola Luis,
Me paso algo similar probando en linux, pero como no habia podido configurar bien mi token-usb en ubuntu (terminaba reconociendolo como dispositivo usb pero no los softs firmadores) pense que era un problema de drivers especifico del token.

Ahora armo un build linkeando los .so que mencionaste, tenes el path completo? mas alla que no sirva para otras instalaciones, al menos sacarnos la duda si el problema realmente es la inclusión del .so

¿Cómo comprobas que los drivers de tu token estan correctamente configurados? ¿Aladin provee un soft particular?

Hola. Investigando un poco, el agregado del .so/.dll que el Applet hace en código, se puede hacer por configuración en el sistema operativo host (linux en este caso)

To install the provider statically you need to add it as an entry to the java.security file which can be found in $JAVA_HOME/jre/lib/security/java.security for the JRE/JDK you are using. Look for a list of lines with security.provider.X where X is some number. At the bottom of the list add the line:
security.provider.N=sun.security.pkcs11.SunPKCS11 /opt/bar/cfg/pkcs11.cfg

where N is one more than the last number in the list.

The configuration file is a text file that contains entries in the following format.

attribute = value

The valid values for attribute and value are described in the table in this section. The two mandatory attributes are name and library. Here is a sample configuration file.

name = FooAccelerator
library = /opt/foo/lib/libpkcs11.so

Es decir, en el java.security agregar una linea apuntando a un .cfg y en el .cfg mandar el path del .so. Resulta raro porque los softwares que instalan drivers de los token no actualizan esta configuración… Sería de mucha utilidad probar si te funciona en kubuntu. Gracias

Disculpen por revivir el hilo y por la demora en contestar.

Con Hernan habiamos estado mirando esto, y en su momento lo probamos pero no pudimos transmitirles los resultados.

Yo agrege esta linea
security.provider.10=sun.security.pkcs11.SunPKCS11 /etc/pkcs11.cfg

al archivo /opt/jre1.7.0_09/lib/security/java.security

dentro de /etc/pkcs11.cfg
name=OpenSC
description=SunPKCS11 via OpenSC
library=/lib64/libASEP11.so

sin embargo el resultado fue el mismo, cuando muestra el dialogo para elegir el certificado … no muestra nada ninguno que este en el token.

Es posible que el firmador, no este invocando el modulo pkcs11 que se configura a nivel del jre ?
No coloque correctamente mi configuracion?

Saludos y gracias por darnos una mano con este tema.

Ahora disculpas de mi parte, estaba de mini-vacaciones!
Estuve laburando bastante ultimamente en lo interno del firmador (en un rato armo un post con las novedades), habia mucho desorden en como elegia el keystore, primero intentaba usar el del browser (tiene una manera bastante error-prone de buscar a mano dentro de la configuracion de firefox) y luego recien usaba pkcs11. Por eso supongo que te mostrando el listadito vacio de certificados, en lugar de los certificados del token.
Además habia un par de bugs que hacian que funcionara casi de casualidad. Incluso en windows era tan bizarro que abria el keystore pkcs11 y despues terminaba usando el keystore de windows, por eso aún poniendo ‘cancelar’ al pedido del PIN terminaba mostrando el listado de certificados.

Aún no llegue a probar esta versión en linux, en cuanto tenga tiempo pruebo esto y veo si anda.
Saludos!

Bien.

Te comento el resultado de mis pruebas.

Configuracion:

Token:
Bus 004 Device 006: ID 0dc3:0900 Athena Smartcard Solutions, Inc.

# pcscd --version
pcsc-lite version 1.8.10.

# Tema Java
Java Plugin 10.45.2.18
Usando versión de JRE 1.7.0_45-b18 Java HotSpot™ 64-Bit Server VM

Linea agregada a $JAVA_HOME/lib/security/java.security
security.provider.10=sun.security.pkcs11.SunPKCS11 /etc/pkcs11.cfg

# Toba
Version Framework 2.4
Firmador esta sacado de la version de toba 2.4.1 (seria la 1.3)

Archivo cat /etc/pkcs11.cfg
name = OpenSC
description = SunPKCS11_via_OpenSC
library = /lib64/libASEP11.so
#slotListIndex = 1
(esto ultimo estaba probando las opciones de slot y slotListIndex) no me funciono

Problema 1:
Si no tengo el token colocado en el usb, la aplicacion java falla al inicilializarse (te adjunto pila del error Abajo)
Y luego de esto, no se puede utilizar mas, incluso enchufando posteriormente el token. (debo reiniciar el firefox)

Problema 2:
Incluso el token conectado y funcionando (para otras aplicaciones),
Incluso iniciada la session del token (por medio de Editar - Preferencias - Avanzadas - Certificados - Dispositivos de Seguridad)

Solamente me muestra los certificados configurados en el firefox (dispositivo criptografico de software) y no asi los del token.

Cualquier cosa estamos en contacto y muchas gracias por la ayuda prestada

* Error Problema 1
java.security.ProviderException: Initialization failed
at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:375)
at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:103)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.security.jca.ProviderConfig$2.run(Unknown Source)
at sun.security.jca.ProviderConfig$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jca.ProviderConfig.doLoadProvider(Unknown Source)
at sun.security.jca.ProviderConfig.getProvider(Unknown Source)
at sun.security.jca.ProviderList.getProvider(Unknown Source)
at sun.security.jca.ProviderList.getService(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at java.security.Security.getImpl(Unknown Source)
at java.security.AlgorithmParameters.getInstance(Unknown Source)
at sun.security.x509.AlgorithmId.decodeParams(Unknown Source)
at sun.security.x509.AlgorithmId.(Unknown Source)
at sun.security.x509.AlgorithmId.parse(Unknown Source)
at sun.security.x509.X509Key.parse(Unknown Source)
at sun.security.x509.CertificateX509Key.(Unknown Source)
at sun.security.x509.X509CertInfo.parse(Unknown Source)
at sun.security.x509.X509CertInfo.(Unknown Source)
at sun.security.x509.X509CertImpl.parse(Unknown Source)
at sun.security.x509.X509CertImpl.(Unknown Source)
at sun.security.provider.X509Factory.engineGenerateCertificate(Unknown Source)
at java.security.cert.CertificateFactory.generateCertificate(Unknown Source)
at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
at java.security.KeyStore.load(Unknown Source)
at com.sun.deploy.security.RootCertStore$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.RootCertStore.loadCertStore(Unknown Source)
at com.sun.deploy.security.RootCertStore.load(Unknown Source)
at com.sun.deploy.security.RootCertStore.load(Unknown Source)
at com.sun.deploy.security.ImmutableCertStore.load(Unknown Source)
at com.sun.deploy.security.LazyRootStore.loadJREStore(Unknown Source)
at com.sun.deploy.security.LazyRootStore.getTrustAnchors(Unknown Source)
at com.sun.deploy.security.TrustDecider.getValidationState(Unknown Source)
at com.sun.deploy.security.TrustDecider.validateChain(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.isTrustedByTrustDecider(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.getTrustedCodeSources(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.strategy(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.openClassPathElement(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.security.ProviderException: slotListIndex is 0 but token only has 0 slots
at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:356)
… 69 more

Gracias por la prueba Carlos. Te cuento que estoy rearmando las API-REST del siu (servicios web en toba) y no tuve tiempo de meterle al firmador desde entonces. En cuanto pueda meto un fix y te pido probar.
Gracias!

Hola Sebastian,

Me comunico para saber si tendrías novedades respecto al uso del firmador en Linux. Conoces de algún caso de éxito o mejoras que se hayan realizado desde Febrero a la fecha?

Desde el Poder Judicial de Misiones también se realizaron pruebas con CryptoApplet en linux y fueron satisfactorias. Tenes idea si hubo implementaciones de este applet o si piensan incorporarlo a Toba ya que funciona de la misma forma que el applet de la ONTI.
( http://jira.uji.es/confluence/display/CRYPTOAPPLET/Home )

Saludos

Disculpas, no vi este mensaje antes…

La unica mejora que metí fue la posibilidad de configurar para poner o no un watermark. De paso cambie la forma de agregarlo para que no sea una modificación del documento (invalida firmas previas) y sea una annotation
Aca esta el changelog de los cambios https://repositorio.siu.edu.ar/trac/firma/log/firmador_pdf?action=stop_on_copy&mode=stop_on_copy&stop_rev=&limit=100&verbose=on

No lo he probado, muy buena pinta! Soporta firma en lotes o hay que ir uno por uno?
Estaría bueno, cuando vuelva al tema firma lo instancio a ver como se engancha.