Firmar JARs Java Web Sart

Últimamente he investigado sobre applets, swing y JNLP y ha resultado un tema muy interesante, ya que abarca conceptos de seguridad, diseño, arquitectura de cliente servidor, etc…

Como dato cultural: Java Web Start es un mecanismo desarrollado por SUN para ejecutar aplicaciones de contenido rico (swing y applets) a través del navegador web, esto se realiza por medio del JNLP que es un protocolo de comunicación que permite lanzar nuestras applicaciones desde un lugar remoto, anteriormente esto se podia manejar mediante applets pero.. por razones de seguridad se les negaba acceso a los recursos de la maquina, como carpetas de sistema, archivos, etc… ya que alguién puede manipularlo de forma incorrecta y robar información de los que ejecuten el código.

Sobre todo en la seguridad, encontre este enlace donde explican màs a detalle cuales son las restricciones de las aplicaciones (swing/applets):

http://www.chuidiang.com/chuwiki/index.php?title=Firmar_Applets

Pero bueno al grano, para poder hacer que nuestras aplicaciones ejecuten con toda su funcionalidad y sin restricciones debemos firmarlas, y claro!! que el usuario que lo ejecute, acepte esa firma, podemos hacerlo de la siguiente manera:

1. Generar la llave: Es el identificador que va a validar nuestra aplicación, yo encontre estas dos formas de hacerlo,  la primera genera la llave por un tiempo determinado y la segunda la genera con vigencia de un año, puedes utilizar cualquiera. Abrimos una terminal y escribrimos:

#Comando para generar la llave con vigencia de un año
keytool -genkey -alias NOMBRE_LLAVE -validity 360 -v

#Genera la llave "MyKey" con la vigencia por un año (es el valor por defecto) y determina el algoritmo con RSA
keytool -genkey -alias MyKey -keyalg rssa

Nota: Para comprobar que el certificado se ha generado correctamente se puede comprobar con el siguiente comando, que listará todos los certificados que tenemos en nuestro keystore:

#Listar certificados en resumen
keytool --list
#Listar certificados a detalle
keytool –list -v

2. Exportar el certificado (OPCIONAL): Esto es se utiliza cuando tienes que proporcionar el certificado de seguridad ,  establece un contrato, un contrato con el navegador para asegurar el contenido que se esta descargando proviene de una fuente segura, si quieres que tu aplicación sea validada tienes que darle una copia del certificado al usuario que lo va a utilizar.

keytool -export -alias Mykey -file MyCert.crt

3. Comprimir tu applicación (OPCIONAL): Esto es para crear el archivo jar solamente si tienes tus classes en carpetas, pero como hoy todo mundo utiliza algún IDE no creo que sea necesario que hagas esto, solo busca donde se genero tu archivo y te pasas al siguiente punto para firmarlo

jar cvf file.jar main/

4. Firmar el jar: Aqui esta lo chido!!, en una terminal buscas tu jar y lo firmas con la llave que generaste:

jarsigner file.jar Mykey

5. Verificar la firma: Solo es para ver si realmente ya esta firmada nuestra aplicación.

jarsigner -verify -verbose -certs file.jar

Con esto nuestras applicaciones ya tienen permisos hasta para crear y modificar archivos en el cliente, claro solo si el usuario acepta ejecutarlos jaja :p.

Si deseas más información YO recomiendo que visites la documentación de java, realmente todo viene muy bien explicado ahí.

De JavaWebStart

Saludos

13 comentarios en “Firmar JARs Java Web Sart

    • jaehoo dijo:

      Lo siento mucho pero tu comentario me suena a “hazme la chamba y para q no me canse en buscarlo me lo dejas en el mail” pero como la neta estoy ocupado no pienso hacerlo además mi amigo en el pedir esta el dar…. hay que aprender a ser mas humildes… lo que si te voy a decir es que lo que pides es algo muy fácil de hacer.. así q mucha suerte….

  1. Jebo dijo:

    Compañero, el articulo me parece muy bueno, pero tengo una pregunta, para utilizar wl java web start se necesitan firmar algunos jar, pero esto se hace en el servidor web?, pero si no se dispone de un servicio web, si no de, por ejemplo una carpeta compartida?, como se firmarían estos jar? De antemano gracias por tu ayuda.

    • jaehoo dijo:

      Hola, la verdad no he entendido muy bien tu pregunta…. y ahora que lo mencionas creo que debería reescribir el articulo ya que en varios puntos lo dejo todo al aire :p jaja pero bueno… eso me pasa por querer dejar las cosas lo mas corto posibles….

      Asi que veamos… tu tienes una aplicación java (swing o applet), java web start (JNLP) es un protocolo de comunicación desarrollado por SUN que permite ejecutar estas aplicaciones a través del navegador web, las aplicaciones swing son muy ricas en contenido y te permiten hacer muchas cosas desde controlar eventos hasta usar recursos de la maquina, y para evitar que alguien se aproveche de esta capacidad y la utilicen para robar datos se decidió crear la firma de seguridad.

      Esa firma sirve básicamente para 2 cosas:
      1. Crea un mecanismo de validación que te permite saber si una aplicación es segura o no. (pregunta al usuario si desea ejecutarla)
      2. Otorga ciertos permisos a la aplicación para utilizar recursos de la maquina ( escribir archivos, usar impresoras, etc…)

      No es necesario un servicio web, simplemente la firma te ayuda a que tu aplicación pueda ejecutarse a través del navegador (bajo ciertas condiciones), para firmarlos es muy facil… (ya he reescrito la entrada, espero sea util n_n )

      Saludos

      • Jebo dijo:

        Hola, gracias por tu ayuda, ya se como firmar los archivos JAR, te explico algo: en mi proyecto tengo 3 JAR:
        1: aplicacion.jar
        2: libreria1.jar
        3: libreria2.jar, esto

        Al ejecutar el archivo JNLP, java web start me genera este error: “Falta una entrada firmada en el recurso: libreria2.jar”, esta librería fue descargada de internet para conexión con BD MySql; en vista que java web start solicitaba firmas, decidí firmar los JAR.

        He podido firmas los 3 archivos sin ningún problema, pero cuando ejecuto el archivo JNLP, me sale el error: “Se ha usado más de un certificado para firmar el recurso: libreria2.jar”; esta ya habia sido firmada antes, entonces la pregunta es como puedo eliminar o actualizar la firma?

        He estado buscando la forma de hacerlo, pero hasta ahora no he podido encontrar nada.

      • jaehoo dijo:

        Ok, pues as mi me paso algo similar pero nunca pude agregar mas de un jar😄 jaja, pero bueno te doy un tip que se me ocurrio y a mi me funciono, descomprime tus otros jar y el de tu app. en una carpeta y despues los recomprimes todos (fijate en el paso 3), asi con eso creas un solo jar que contenga todos los archivos .class, despues lo firmas y lo intentas ejecutar. Espero te sirva Saludos

      • Jebo dijo:

        Hola gracias por tu ayuda, ya pude agregar los jar, resulta que era específicamente el jar de conexión el que estaba fallando, jeje.

        Pero ahora tengo otra pregunta, has podido agregar al archivo JNLP un archivo de propiedades?, es decir, si el jar principal necesita un archivos.properties, como lo cargas en el archivo JNLP? Según he leído, hay un elemento del archivo JNLP, que se llama Property, pero este me pide 2 atributos y la verdad es que no se que va en el segundo. he hecho pruebas y nada que funciona, alguna vez has hacho algo como esto?

      • jaehoo dijo:

        Orale que bien que ya te quedo, como te decia yo nunca pude agregar mas de un jar, aunq encontre muchos ejemplos en internet de como hacerlo a mi simplemente no me funcionaba ninguno, haber si un dia me pasas tu ejemplo, pero bueno por lo que me preguntas a mi se me ocurre unicamente cargar tu properties agregandolo al class path (dentro de tu jar) aunq esto podria resultar riesgoso ya que si alguien descarga tu jar obtendria los paramertos de conexion a la base (si es que te quieres conectar a una).

        Pero si, debe de haber forma de cargar el properties, hace mucho tuve que meterme de manera ilegal a volarme una app asi jaja😄 y de ahi aprendi varios truquillos de su jnlp :

        El JNLP se puede ejecutar de dos formas:

          A traves de una pagina web
          Directamente desde escritorio (descargando el jnlp)

        Por lo que yo vi puedes pasar 2 cosas:

        1. Argumentos: Te ayuda a pasar datos de la pagina web al jnlp, dentro de tu pagina tag del jnlp declaras algo asi:
        >param name='MiParametro' value='valor'>
        y despues lo puedes recuperar en el codigo java asi :
        getParameter("location")

        nota: inverti las llaves porque no salen los tags.
        2. Recursos: jars y propiedades, en tu jnlp declaras el tag y dentro colocas algo asi:
        >resourcesproperty name=’apple.laf.useScreenMenuBar’ value=’true’/property name=’apple.awt.window.position.forceSafeProgrammaticPositioning’ value=’false’/jar href=’eLiveFull.jar’ main=’true’/jar href=’eLive.jar’// resources<
        Yo me imagino que aqui podrias intentar meter el properties, pero el chiste seria probar.

        Actualmente yo llevo una aplicación que se ejecuta a traves de JNLP, pero para resguardar esa informacion tuve que separarla en dos partes, una que es la presentacion que se encarga de ingresar/ mostrar los datos (el archivo jar, que lo unico que trae son pantallas, no hay logica de negocio en el), y otra app en el servidor que se encarga de atender peticiones, procesar los datos, y devolver una respuesta. asi no hay riesgo si alguien se vuela mi jar lo unico que obtiene son pantallas sin datos que pongan en riesgo la información de mi app.

        Espero ayude, saludos

  2. Alejandro Ramírez dijo:

    Hola primero felicitarte por tu pagina esta mamalona jeje oye una consulta resulta que tengo una aplicación que hice con el IDE Netbeans y tiene una conexión con una base de datos en MySQL bueno genere el jar y el jnlp muy bonito, cuando me dispuse a ejecutar el archivo, sorpresa no funcionaba ¬¬ busque y me encontré con tu articulo y dije a huevo, solo hay que fírmalo y lo hice paso por paso como lo indicas y toda la cosa y para mi fortuna funciono, me pregunto si daba permiso para establecer conexión con localhost y ya no, sin embargo solo jalo el primer jFrame que el de login ahí le estuve moviendo y nada. será que le tengo que mandar algún parámetro para la conexión con la base de datos en el jnlp?? me podrías ayudar jeje de cualquier forma gracias.

    Nota: asi tengo el jnlp

    ExamenesPHI
    Alejandro

    ExamenesPHI
    ExamenesPHI

  3. Alejandro Ramírez dijo:

    nota: hice lo q tu para que salga la info

    >?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?>
    >jnlp codebase=”” href=”launch.jnlp” spec=”1.0+”>
    >information>
    >title>ExamenesPHI
    >vendor>Alejandro
    >homepage href=””/>
    >description>ExamenesPHI
    >description kind=”short”>ExamenesPHI

    >/information>

    >resources>
    >j2se version=”1.5+”/>
    >jar eager=”true” href=”ExamenesPHI.jar” main=”true”/>

    >jar href=”lib/mysql-connector-java-5.1.6-bin.jar”/>
    >jar href=”lib/substance.jar”/>
    >jar href=”lib/substance.jar”/>
    >/resources>
    >application-desc main-class=”Pantallas.Login”>

    >/application-desc>
    >/jnlp>

  4. jt martin dijo:

    buen dia yo tengo una bronca, hice una pagina web con eclipse usando jsps y me pidieron que con un jnlp permita acceder a twitter tengo 4 archivos jar, pero no se como funciona esto, es la primera ves que escucho el concepto de jnlp, además de que casi no se java soy novato, alguien podría explicarme paso a paso? gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s