java.io.EOFException y el JavaKeyStore para applets

Una de las características por la cual me encanta Gentoo es por su excelente soporte a Java y sin titubear puedo decir que es uno de los sistemas operativos más flexibles para desarrollo en Java pudiendo elegir los compiladores y maquinas virtuales que deseo utilizar con un par de comandos.

A decisión personal utilizo OpenJDK como mi maquina virtual de cabecera y OracleJDK solo para mi navegador web (por algunos certificados que OpenJDK no tiene). En medio cambios abruptos y mal planificados de maquinas virtuales  obtuve como resultado una corrupción en el almacén de certificados confiables sin siquiera percatarme.

Luego, al intentar acceder a el portal en linea de mi banco, recibía el siguiente error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:645)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
    at java.security.KeyStore.load(KeyStore.java:1214)
    at com.sun.deploy.security.DeploySigningCertStore$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.deploy.security.DeploySigningCertStore.loadCertStore(Unknown Source)
    at com.sun.deploy.security.DeploySigningCertStore.load(Unknown Source)
    at com.sun.deploy.security.DeploySigningCertStore.load(Unknown Source)
    at com.sun.deploy.panel.CertificatesInfo.reset(Unknown Source)
    at com.sun.deploy.panel.CertificatesInfo.(Unknown Source)
    at com.sun.deploy.panel.CertificatesDialog.(Unknown Source)
    at com.sun.deploy.panel.SecurityPanel.certsBtnActionPerformed(Unknown Source)
    at com.sun.deploy.panel.SecurityPanel.access$000(Unknown Source)
    at com.sun.deploy.panel.SecurityPanel$1.actionPerformed(Unknown Source)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:696)
    at java.awt.EventQueue$4.run(EventQueue.java:694)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

El error en si no es muy descriptivo y me genero un dolor de cabeza horrible. Luego de leer un poco en los foros de Oracle, el verdadero problema es que el archivo de certificados para el usuario en ejecución estaba dañado y por ser un archivo de configuración a nivel de usuario este no es eliminado con cada reinstalación/desinstalación de Java (esto tambien ocurre en Windows).

¿Solución?

La solución más factible al dañar este archivo es eliminarlo, es casi imposible editarlo a mano porque su contenido es binario, vale la pena resaltar que si el archivo esta vació recibirán el mismo error antes mencionado. Asi que procedemos a borrarlo:

1
rm $HOME/.java/deployment/security/trusted.certs

Como consecuencia de este paso, en el primer intento de ejecución de un applet tendremos que confirmar nuevamente si confiamos en el y esto sucederá con todos los applets previamente confirmados. Engorroso pero nuevamente puedo entrar a ver mi estado de cuenta :D.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *