Wednesday, September 3, 2014

Parámetros y comodines (wildcards) en Excel para SQL Server Express

Antecedentes

Un día no muy lejano se me ocurrió probar la conexión entre MySQL Server y Excel, después de una conexión exitosa, decidí intentar con SQL Server. 
Instalé SQL Server Express 2008 R2 y utilicé ESF Database Migration para mover algunas tablas de MySQL a SQL Server. Todo iba bien hasta que intenté realizar algunas consultas con parámetros establecidos por el usuario desde celdas en Excel. SQL Server respondía error en la consulta pero no me daba pistas del error en especifico, por lo que busqué algún método de rastrear las consultas de SQL Server y esto fue lo que encontré...

Introducción

SQL Server (versión de paga) tiene una herramienta de nombre "SQL Server Managment Studio" (SSMS), la cual sirve para configurar y administrar las bases de datos. Dentro de estas herramientas se incluye un componente de nombre "SQL Server Profiler" el cual captura los eventos de SQL Server, y como tal; las consultas realizas. El problema llega cuando te das cuenta de que este complemento solo está disponible para la versión de paga, dejando a SQL Server Express sin posibilidad oficial de monitorear las consultas.

Solución (Monitorear consultas SQL Server Express)

Dentro de las fabulosas soluciones que se desarrollan en CodePlex, existe una herramienta de nombre ExpressProfiler, la cual está enfocada a ser un sustituto sencillo y siempre para "SQL Server Profiler" y lo mejor es que funciona para "SQL Server Express", entonces:

  1.- Descargamos e instalamos Express Pofiler.
  2.- Ejecutamos la aplicación desde (C:\Program Files (x86)\ExpressProfiler\ExpressProfiler.exe).
  3.- Seleccionamos nuestro servidor e instancia.
  4.- Damos click en "Start Trace".

Listo, con esto podemos monitorear las consultas y ajustar los parámetros de acuerdo a nuestras necesidades.

Solución (Parámetros en Excel para SQL Server)

La solución simplificada de este post, se resume en lo siguiente:

* Cómo podemos observar en Express Profiler, los parámetros en automático incluyen los entrecomillados sencillos, es decir, no es necesario agregar las comillas para los parámetros de texto o fecha.

* Para agregar los wildcards de SQL utilizamos otra celda con referencia y con la ayuda de formulas completamos nuestra consulta.

Ejemplo de consulta desde Microsoft Query:

SELECT p.nombre AS 'Proyecto', u.nombre AS 'Usuario', p.tot_solicitado AS 'Total'
FROM prota2.proyectos_internos p
INNER JOIN prota2.usuarios u ON p.usuario = u.id
INNER JOIN prota2.cuentas_b c ON p.cuenta_b = c.id
WHERE p.fecha_solicitud between ? AND ?
AND p.nombre LIKE ?
AND c.num_cuenta_b LIKE ?
AND u.nombre LIKE ?

Los parámetros editables por el usuario son (agregamos en Excel):

Fig. 1.1 - Parámetros definidos por el usuario en Excel.

Cómo se puede observar, tenemos en este ejemplo:
  - 3 Parámetros de texto.
  - 2 Parámetros de fecha (validados por una lista para evitar problemas de la información que ingrese el usuario).

Las formulas de ayuda para poder utilizar los wildcards de SQL son:

Fig. 1.2 - Formulas de ayuda para wildcards.

En el Express Profiler se puede observar la consulta como:

N'@P1 nvarchar(27),@P2 nvarchar(27),@P3 varchar(100),@P4 varchar(20),@P5 varchar(35)',N'SELECT p.nombre AS ''Proyecto'', u.nombre AS ''Usuario'', p.tot_solicitado AS ''Total''
FROM prota2.proyectos_internos p
INNER JOIN prota2.usuarios u ON p.usuario = u.id
INNER JOIN prota2.cuentas_b c ON p.cuenta_b = c.id
WHERE p.fecha_solicitud between @P1 AND @P2
AND p.nombre LIKE @P3
AND c.num_cuenta_b LIKE @P4
AND u.nombre LIKE @P5',N'20140101',N'20140927','%%','%%','%emir%'

En resumen

Los parámetros en Excel incluyen en automático los entrecomilldos y para agregar wildcards debemos utilizar formulas, como "concatenar" o "texto" para establecer formato a un valor.

Tuesday, August 26, 2014

HP Scanjet G3110 hacerlo funcionar con Mavericks

Antecedentes


Una de mis compañeras de trabajo utilizaba como herramienta de trabajo una iMac (Mid-2010), cargada

con Mavericks (10.9.4) y como parte de la renovación de equipo de computo ahora utiliza otra iMac (Late-2012) con la misma versión de Mavericks (10.9.4), no es un gran salto, pero ese no es el tema de este post. Todo funcionó correcto hasta que conectó el escaner HP Scanjet G3110, el cual no era detectado en su "nueva" maquina y en su equipo anterior funcionaba a la perfección.

Introducción


Para resolver este problema, lo primero que hice fue revisé el "reporte del sistema", con el fin de corroborar que Mavericks detectara el scanjet, por lo que pude apreciar que en el sistema operativo aparecía el escaner conectado.

Esto me hizo pensar que el problema sería de drivers. Busqué los controladores para Mavericks en la pagina oficial de HP, pero desfortunadamente encontré de Tiger a Snow Leopard.

Fig. 1.1. "System Report"

Recordando que aun tenía acceso a la maquina anterior (en donde el escaner funciona sin problemas), supuse que no habría mayor problema por obtener los drivers necesarios para Mavericks.

Solución

Mavericks utiliza el software "Image Capture" para administrar aquellos dispositivos de donde puede copiar imagenes como: iPhones, cámaras digitales y escaners. Dentro de la carpeta de la aplicación (/Library/Image Capture/), se encuentra un subfolder de nombre "Devices", la cual contenía los escaners que esa computadora había utilizado, incluyendo uno de nombre "HP Scanner.app".

Copié este paquete a la "nueva" iMac, pegandolo en el mismo directorio y "listo", pude escaner utilizando el Scanjet G3110.

Fig. 1.2. Carpeta de "Image Capture"

En resumen


1.- Descarga este paquete HPScanner.zip
2.- Descomprimelo
3.- Copia su conteniedo "HP Scanner.app" al directorio /Library/Image Capture/Devices.
   Nota: El folder /Library, es el del sistema operativo, NO el del usuario. Para visualizar el folder correcto en el "Finder", da click en el menú: Go -> Go to Folder, en la ventana que pide escribas la ruta solo teclea la diagonal invertida (sin comillas) "/", das enter y navegas a la ruta mencionada.
4.- Ejecutas "Image Capture", esperas un momento a que cargue este nuevo paquete.
5.- Listo, ahora puedes escanear con tu G3110 en Mavericks.

Fig. 1.3. HP G3110 en "Image Capture"


Nota

Dentro de este paquete, encontré que están citados los siguientes escaners:

1.- HP Scanjet G3110
2.- HP Scanjet 200
3.- HP Scanjet 8270
4.- HP Scanjet 300
5.- HP Scanjet G4010
6.- HP Scanjet N6310
7.- HP Scanjet 5590
8.- HP Scanjet G4050

En caso de que no encuentres los drivers de los dispositivos mencionados para Mavericks en la pagina oficial de HP, intenta cargar este paquete y decirnos si funciona también para el modelo en cuestión.

Monday, August 18, 2014

RV042 V3 - Recuperar después de una actualización de firmware fallida

Antecedentes

En una de las empresas hermanas para la que trabajo, se utiliza un router cisco Rv042 V3, principalmente para crear el enlace VPN entre sucursales.

Después de una fallida actualización de firmware (el router iniciaba con el led de DIAG [diagnostic] parpadeando en color rojo), por lo que solicité me mandaran el router para intentar restaurarlo.

Introducción

Encontré en los foros oficiales de Cisco que puedes iniciar el router en modo "Boot Loader" de tal forma que puedes volver a cargar el firmware via TFTP. En los posts comentan que existe una herramienta oficial de Cisco para recuperar el firmware pero desafortunamente todos los links apuntaban para el RV042 v1/v2.

Al seguir "googleando" encontré la herramienta de recuperación de firmware para la V3, en este link la puedes descargar:

Aplicando la solución oficial - fallida

La solución oficial de Cisco se detalla de la siguiente forma:

1.- Descargar la utileria de recuperación de firmware a tu computadora.
2.- Fijar tu tarjeta de red con IP fija en el siguiente rango de red: 192.168.1.0/24.
3.- Desconectar el router de la toma de corriente:
 3.1.- Presionar y mantener presionar el botón de reset.
 3.2.- Conectar el router a la tomar de corriente (manteniendo presionar el botón de reset), por 5 segundos.
4.- Realizar un ping a la IP del router (192.168.1.1) para cerciorarnos que se encuentra en modo "boot loader".
5.- Ejecutar la aplicación de recuperación de firmware (.exe).

En mi caso, llegué hasta el punto #4 con éxito, pero al intentar restaurar el firmware con la aplicación, me mostraba el siguiente error:

Firmware Rescue Utility (error).

Solución exitosa

TFTP es un protocolo de transferencia de archivos sumamente simple, se utiliza para cargar configuraciones, no requiere autenticación y funciona sobre el puerto UDP 69.

Por lo que puedes actualizar el firmware utilizando otra aplicación:

1.- Descargas TFTP32 by Ph. Jounin (Windows Vista en adelante también tiene integrado su cliente de TFTP via consola de commandos).
2.- Configuras el equipo hasta el punto #4 de la solución anterior.
3.- Ejecutas TFTP y seleccionas la pestaña "TFTP Client", para agregar los siguientes parámetros:
 3.1.- Host: 192.168.1.1
 3.2.- Local file: seleccionas la imagen del firmware que intentaste cargar (con la que comenzó todo este problema), también puedes restaurar otra versión de firmware.
  3.3.- Block size: default
4.- Das click en "PUT".
5.- Esperas a que el software cargue la imagen (se muestra una barra de progreso).

TFTP32

Una vez concluida la carga del firmware, en automático el router se reinicia, por lo que solo es cuestion de esperar a su restauración/reinicio.

Listo, hemos recuperado un RV042 V3 de una imagen de firmware dañada.

Fuentes:


  • https://supportforums.cisco.com/discussion/11080591/rv042-diag-led-blinking
  • https://supportforums.cisco.com/discussion/11081721/rv042-firmware-flash-utility

Wednesday, July 9, 2014

SQUID / No se puede acceder a Interjet

Antecedentes

Uno de los usuarios argumentó que no podía acceder a la pagina de Interjet. Este usuario utilizaba una pagina de convenio, la cual, al ingresar un código correctamente, redirecciona a una sección dentro de http://www.interjet.com.mx la cual todos los vuelos incluyen cierto  porcentaje de descuento.

Introducción

Ingresando al sitio de convenio con proxy, al rediccionar a Interjet, este manda a un sitio de nombre:
  • http://200.57.159.179/SorryPage/
El famoso "SorryPage" redirecciona a una pequeña sección de búsqueda de vuelos pero sin descuento.

Y cabe señalar que ingresando directamente al sitio de interjet con proxy redirecciona a esta misma sección de "SorryPage".

Por otro lado, ingresando al sitio de convenio sin proxy, este redirecciona correctamente a la sección de buscar vuelos con descuento, dentro del sitio web de Interjet.

Solución

Al ingresar a http://ww.interjet.com.mx, se puede apreciar que detecta el lenguaje del "User-Agent" (navegador) para desplegar sitio en el idioma y el país de compra. Lo cual no se me hace correcto, ya que es de lo más normal utilizar el navegador en otro idioma (sobre todo en Ingles).
Para esto, los programadores de Interjet hacen uso del request header "HTTP_ACCEPT_LANGUAGE".

Esto me hizo pensar en que estarían utilizando algún request header para filtrar el acceso.

Para saber que "request headers" manda SQUID, podemos utilizar un pequeño script de PHP el cual lea todos estos valores accediendo a el sin proxy y con proxy.

El sencillo script de PHP se muestra como:

// Leemos todos las variables del servidor
foreach ($_SERVER as $name => $value){ 
  if (substr($name, 0, 5) == 'HTTP_') 
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
  }
// Imprimimos los resultados
var_dump($headers); 

El resultado de este script entrando desde Chrome sin proxy es:

array(8) {
  ["Accept"]=>
  string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
  ["Accept-Encoding"]=>
  string(17) "gzip,deflate,sdch"
  ["Accept-Language"]=>
  string(45) "es-419,es;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2"
  ["Cache-Control"]=>
  string(9) "max-age=0"
  ["Connection"]=>
  string(10) "keep-alive"
  ["Cookie"]=>
  string(58) "PHPSESSID=776d3499930de3eea3027f76d3bee0ba; __atuvc=2%7C25"
  ["Host"]=>
  string(16) "paralizabal.com"
  ["User-Agent"]=>
  string(109) "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
}

Y el resultado del mismo script desde Chrome pero con proxy es:

array(10) {
  ["Accept"]=>
  string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  ["Accept-Encoding"]=>
  string(21) "identity,gzip,deflate"
  ["Accept-Language"]=>
  string(59) "es-MX,es-ES;q=0.8,es-AR;q=0.7,es;q=0.5,en-US;q=0.3,en;q=0.2"
  ["Cache-Control"]=>
  string(14) "max-age=259200"
  ["Connection"]=>
  string(10) "keep-alive"
  ["Cookie"]=>
  string(172) "_ga=GA1.3.1925363739.1393444304; __utma=88164442.1925363739.1393444304.1399225959.1399482628.2; __utmz=88164442.1399225959.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
  ["Host"]=>
  string(16) "paralizabal.com"
  ["User-Agent"]=>
  string(72) "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"
  ["X-Forwarded-For"]=>
  string(7) "192.168.1.100"
}

Con esto podemos apreciar que la diferencia es el encabezado "X-Forwarded-For", el cual indica la IP original del cliente conectado a un servidor web mediante un HTTP-Proxy o Load balancer, estándar sugerido, precisamente, por los desarrolladores de SQUID.

 Así que la solución final es deshabilidar este encabezado en SQUID, de forma muy sencilla, agregamos en el archivo squid.conf la siguiente línea:

forwarded_for on

Reiniciamos SQUID y listo!, podemos entrar al sitio principal de http://ww.interjet.com.mx.

Friday, July 4, 2014

Dado un string, analizarlo y convertirlo a palindrome en caso que sea posible

Antecedentes

En una entrevista de trabajo me pidieron realizar la siguiente actividad: "Desarrollar una función la cual recibirá un string, analizarlo y tratar de convertirlo a palindrome". No precisamente el string estará en el mismo orden, por ejemplo, la función puede recibir ->  SSUUG la cual en su versión palindrome sería SUGUS.

Introducción

El error que cometí fue el estar pensando en el detalle de las posibles combinaciones, en mi mente estaba:

Posibilidades de crear una palabra palindrome dependiendo su longitud

2 -> 2
3 -> 2-1
4 -> 4, 2-2
5 -> 2-2-1
6 -> 6, 4-2, 2-2-2
7 -> 6-1, 4-2-1, 2-2-2-1
8 -> 8, 6-2, 4-4, 4-2-2, 2-2-2-2
9 -> 8-1, 6-2-1, 4-4-1, 4-2-2-1, 2-2-2-2-1
10 -> 10, 8-2, 6-4, 4-4-2, 4-2-2-2-2, 2-2-2-2-2

Por lo que después de haber creado la función en base a la lógica más complicada, pensé en lo que el entrevistador me dijo al final: "Solo puede haber un fallo".

En efecto, las letras se deben presentar en pares y si se tiene 2 letras individuales diferentes, no es posible convertirla a palindrome.

Solución

La solución queda detallada de la siguiente forma:

1.- Crear un array con las letras únicas y las veces en que se repite (desde aquí se puede hacer la validación de palindrome pero yo decidí hacerlo en el paso #2).
2.- Imprimir las palabras del array en forma palindrome.

El código en javascript se ve así:




Y aquí un pequeño demo:

Thursday, June 5, 2014

Modificar archivo class de un jar sin tener el código fuente

Antecedentes


La empresa para la que trabajo realizó una activación en el estadio Omnilife, la cual tomaba fotografías con una "Samsung Galaxy Camera (Jelly Bean 4.1)", esta cámara recibía señal para el "shooting" desde una tablet "Galaxy Tab 3 (Jelly Bean 4.1)". La logística y desarrollo tecnológico lo realizó un proveedor, una de las herramientas que desarrollaron fue un "uploader" en JAVA, el cual conectaba con un pequeño webservice para tener las fotografías en un micrositio. 
El problema se presentó al tener 2 activaciones al mismo tiempo, que se verían reflejadas en 2 micrositios diferentes, por lo que se debía actualizar la ruta del webservice. Esto representaba cambiar un par de lineas de código pero el problema real era no contar con el código fuente, solo con el jar.

Introducción

El archivo JAR no es más que un zip, por lo que podemos consultar su contenido, ver su estructura, imágenes, paquetes, clases (esto último compilado) con tan solo cambiar la extensión de "jar" a "zip".

Solución

Entendiendo esto, lo que debemos hacer es:
  1. Decompilar el JAR.
  2. Guardar clase como ".java"
  3. Modificar las clases
  4. Compilar ".java"
  5. Actualizar ".class"

1.- Decompilar JAR

Una de las mejores herramientas para decompilar es "Java Decompiler" desarrollada por Emmanuel Dupuy, la cual esta disponible en 4 diferentes sabores: GUI (mi elección), Eclipse,  IntelliJ y Live Demo.
  •  Ejecutamos Java Decompiler -> Nos vamos al menú "Archivo" -> Abrir archivo -> Buscamos nuestro JAR. 
2.- Guardar clase

El programa nos muestra el código reconstruido, con esto podemos copiar toda la clase y pegarla en un nuevo archivo de texto nombre "nombreArchivo.java" y guardarlo en la misma ubicación de nuestro archivo JAR.

3.- Modificar clase


Hacemos las modificaciones de código correspondientes en nuestro archivo "java".

4.- Compilar ".java" (jarc command)

Nota: Muy importante, recomiendo colocar en la carpeta "C:\Program Files\Java\jdk1.7.0_XX\bin", los tres archivo: "jar", "java", "class". Ya que el comando "jar.exe" (que veremos en el siguiente punto) crea el archivo, dentro del jar, con la misma ruta de nuestra ubicación física.

   A) Ejecutamos la consola de windows con permisos de administrador.
   B) Nos movemos a la ubicación del "javac.exe" (c:\Program Files\Java\jdk1.7.0_XX\bin)
   C) Corremos el siguiente comando: javac -classpath nombreArchivo.jar nombreArchivo.java

5.- Actualizar ".class" (jar command)

Por último, para actualizar la clase, utilizamos el comando "jar" de java, por lo que:

   A) Ejecutamos el comando: jar uf nombreArchivo.jar nombreArchivo.class

Listo, hemos modificado código de una JAR, sin tener los fuentes.

 Referencias

  • http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
  • http://docs.oracle.com/javase/tutorial/deployment/jar/update.html





Monday, May 5, 2014

CentOS 6 / Squid - No carga sitios que soportan ipv6

Antecedentes
Squid

Momento en el que uno se convierte en el villano de los usuarios: cuando bloqueas las redes sociales. Efectivamente, me solicitaron volver a activar el bloqueo de ciertos sitios de entretenimiento por horarios y usuarios, pero esta vez squid se comportaba de forma extraña, todos aquellos sitios que soportan ipv6 no eran cargados, por ejemplo:

 - https://www.facebook.com
 - https://www.yahoo.com
 - https://www.ipv6ready.org

Introducción

Mi configuración inicial es:
- CentOS 6.5 i686
- Squid 3.4.3
- Dansguardian 2.10.1.1

De acuerdo a la documentación de squid soporta ipv6 desde la versión 3.1.x, teniendo que agregar ciertos parámetros (en "squid.conf") para la serie de versiones (3.1.x), no así para las versiones superiores, están ya vienen integradas, siempre y cuando se compile con "--enable-ipv6".

Yo contaba con la versión de squid 3.1.10, la cual tiene documentado bugs con ipv6, por lo que decidí actualizarme a la versión 3.4.3 (23/Abril/2014).
Después de actualizar y ajustar los parámetros de "/etc/squid/squid.conf" a la nueva versión, seguía teniendo problemas para abrir sitios que soportarán ipv6, este era el síntoma en los registros:

Comando:
  - # squidclient https://www.facebook.com
       - Sending HTTP request

  - # squidclient https://www.yahoo.com
       - Sending HTTP request

Registros ("/var/log/squid/access.log"):
-TCP_MISS/301 2664 GET https://www.facebook.com - HIER_DIRECT / 2a03:2880:f00b:800:face:b00c:0:1
-TCP_MISS/301 713 GET https://www.yahoo.com:443 - HIER_DIRECT / 2001:4998:44:4:c:9102

-TCP_MISS_ABORTED/000 0 GET https://www.facebook.com - HIER_DIRECT / 2a03:2880:f00b:800:face:b00c:0:1
TCP_MISS_ABORTED/000 0 GET https://www.yahoo.com - HIER_DIRECT / 2001:4998:44:4:c:9102

Solución

La solución en muchos foros, era: "deshabilita ivp6 del squid y de tu CentOS", "Crea un puerto para HTTP y otro para HTTPS", esto no es nada recomendable en la documentación oficial.

La solución la encontré en uno de los parámetros de "squid.conf", el cual está por default en "off":

 -  dns_v4_first on

Reincias squid y "voilà", no más TCP_MISS_ABORTED para sitios que soportan ipv6.

Referencia: http://www.squid-cache.org/Doc/config/dns_v4_first/

Wednesday, April 30, 2014

¿Por qué no puedo entrar al IDSE utilizando Chrome o Firefox?

Antecedentes

En la empresa para la que trabajo, uno de módulos del ERP que desarrollamos, genera archivos en txt para dar altas y bajas del personal de campo y una de las preguntas más comunes de los encargados de esta actividad es: "¿Por qué no puedo acceder al IDSE utilizando Chrome o Firefox?




Introducción

Dos de los navegadores más utilizados en la actualidad son Google Chrome y Mozilla Firefox, por lo que es habitual que se intente acceder al IDSE utilizando uno de estos.


Solución

Respuesta corta: 

  - Los desarrolladores del IDSE no han actualizado el código para cumplir con los nuevos (desde el 2002) lineamientos de seguridad.

Respuesta larga:

   - Vamos a revisar el código para encontrar el problema.

Dentro de la pagina del IDSE, al dar click en el botón "iniciar sesión", manda a llamar la función de javascript "Sing()", la cual en su sexta línea de código contiene:

var pkcs12 = document.firmaForm.certificado.value;


Esto quiere decir que la variable "pkcs12" contiene el nombre del certificado que seleccionamos en el input "certificado digital".

Hacemos un paréntesis en este punto, para recordar que unos de los pasos para acceder a IDSE con Internet Explorer es habilitar la opción "Incluir el directorio local cuando se suban archivo al servidor". Esto hace que la ruta de nuestro archivo se muestre como (igual que el valor de la variable "pckcs12"):

  - Internet Explorer - "C:\Usuarios\UsuarioA\Desktop\certificadoIMSS.pfx"

Por cuestiones de seguridad Chrome/Firefox no incluyen la ruta completa (me parece bastante razonable), dándole a la variable "pckcs12" el valor de:

 - Firefox - "certificadoIMSS.pfx"
 - Chrome - "C:\fakepath\certificadoIMSS.pfx"

Teniendo en cuenta esto, si tratamos de iniciar sesión nos mostrará el error:

 - "El archivo no existe o se modificó la ruta del archivo. Por favor verifique y actualice la información".

Continuamos con nuestro análisis hasta llegar a la línea 371 de uno de los applets, la cual dice:

FileInputStream localFileInputStream = new FileInputStream(paramFile);

Esta línea trata de obtener los bytes del certificado (paramFile=pckcs12) y debido a que Chrome/Firefox no incluyen la ruta absoluta, devuelve el error antes mencionado (no encuentra el archivo en la computadora del cliente).

Soluciones

Algunas de las soluciones son:

1.- Que los desarrolladores actualicen el código / La mejor opción
* La mejor pero menos probable (por los cambios que implica) es que se actualice la forma en que se realiza el "login" en el sistema IDSE, el sistema debe subir el certificado al servidor o crear un nuevo applet para "login" y así poder seleccionar al archivo desde java (no por javascript).

2.- Instalar el complemento IETab.net en Chrome / Probable
* Este complemento es un emulador de Internet Explorer, que tiene habilitada por default la opción para incluir la ruta absoluta de los archivos.

3.- Seguir utilizando Internet Explorer / No recomendable
* Con todos los problemas de seguridad no es recomendable seguir utilizando este navegador.

4.- Crear el directorio C:\fakepath / Chistoso - No recomendable
* Creando el directorio mencionado y agregando a esa ruta el certificado, Chrome pasará la ruta absoluta utilizando el "fakepath" por lo que el applet encontrará el archivo.