start que ejemplo descargar chrome assessment archivos abrir java macos jnlp osx-gatekeeper

java - que - pt assessment client jnlp file



Cómo firmar(dinámicos) archivos JNLP para OSX y Gatekeeper (5)

Mi empresa produce aplicaciones Java para servidores y entrega archivos JNLP para iniciar aplicaciones locales. Desde OSX 10.8.4, se requiere que firme los archivos JNLP con una ID de desarrollador para mantener feliz a Gatekeeper (en realidad, se encuentra en las notas de la versión al final).

La pregunta es: ¿cómo lograr esto? AFAIK puede firmar aplicaciones (tenemos algunas aplicaciones Java firmadas con ID de desarrollador), pero JNLP: los archivos son solo eso: archivos.

A continuación: cómo hacer esto con los archivos JNLP generados. Tenemos que modificarlos ya que provienen de un servidor, por ejemplo, propiedades, URL base, etc.

AFAIK Java tiene un cierto mecanismo para decir que los archivos JNLP se firman a través de su respectivo archivo JAR (el que contiene la clase principal), pero: los archivos jar se firman con un certificado diferente que tampoco cumplirán con Gatekeeper.

Encontré una referencia sobre cómo firmar herramientas y cosas , pero no aplica el escenario de archivos dinámicos.

Lo que no quiero como respuestas: haga clic con el botón derecho y abrir para anular el controlador de acceso o cambiar la configuración del sistema o de Java. Esto no es una opción.

[ACTUALIZACIÓN] Desde OSX 10.9.5 también tiene que firmar con OSX 10.9+ y tener firmas válidas de la versión 2. ¿Cómo se hará esto?


¿ .dmg empaquetar un simple script de shell ejecutable llamado algo como "myapp" en un archivo .dmg firmado que tiene este aspecto:

javaws http://path/to/my/app.jnlp

de esa manera puedes cambiar el .jnlp como quieras sin cambiar tu .dmg . No tengo una ID de desarrollador de Apple, por lo que no puedo probarlo ahora mismo.


Creo que encontré una solución. El único que puedo pensar actualmente. Básicamente, necesitamos envolver el JNLP con un iniciador de aplicaciones personalizado, firmar la aplicación, asegurarnos de que podemos modificar el JNLP sobre la marcha en un servidor y luego ejecutarlo.

Como puede que sepas, hay un proyecto de paquete de aplicaciones que puede envolver cualquier archivo JAR en un ejecutable OSX. Esto puede ser firmado, entregado y no fallará a Gatekeeper. Hice una bifurcación personalizada (que está preparada para una extracción en la bifurcación principal) que puede tomar un archivo JNLP, envolverlo y tienes una aplicación personalizada que hace todo lo que debería hacer una JNLP.

Sin embargo, un requisito es que tenga un certificado válido de "Aplicación de ID de desarrollador"

  1. Dirígete a bitbucket.org y descarga la versión actual
  2. Ejecuta la tarea ant y construye el paquete appbundler.
  3. Eche un vistazo a la documentación de un ejemplo de script de compilación que creará el contenedor de la aplicación.
    • El ejemplo no incluye el JNLP en la aplicación en este momento.
    • La firma de las aplicaciones se crea de forma que el archivo JNLP se pueda modificar más adelante.
    • La aplicación se está poniendo en un archivo zip. Esto es importante para descargar una aplicación ya que solo son directorios
  4. Crea tu código de servidor. Cargue el archivo ZIP, coloque el archivo JNLP en el directorio <yourapp>.app/Contents/Java/
  5. Entregar el archivo zip.

Ahora, si todo salió bien, el archivo zip debería descomprimirse automáticamente en la carpeta de descargas y debería ver el ícono de su aplicación. Si realmente no cometió ningún error, puede ejecutar la aplicación como si fuera una normal.

Espero que esto ayude a muchos desarrolladores a corregir el comportamiento JNLP roto con OSX.

[ACTUALIZACIÓN para JNLPs modificables] Desde OSX 10.9.5 se requiere tener firmas válidas de la versión 2 en su aplicación. Esto significa que el truco que fue usado previamente por el paquete de aplicaciones (establecer un archivo de lista de recursos) ya no funciona. Todo y cualquier cosa tiene que estar firmado ahora y es prácticamente imposible cambiar la aplicación firmada después.

Sin embargo encontré una forma: usar el paquete de aplicaciones. Configure el JNLP en un archivo dentro del directorio Contents/_CodeSignature . No copie todavía su JNLP modificable allí, pero haga esto, por ejemplo, use Java más adelante al parchar el zip (necesitará algún código aquí de todos modos).

Tenga en cuenta: esto solo debería ser necesario si tiene que colocar otro archivo JNLP dinámicamente en el contenedor de la aplicación (de eso se trataron las preguntas)

ACTUALIZACIÓN (08-2017)

Oracle lanzará Java 9 a finales de septiembre. Appbundler no maneja java9 vm correctamente. Cambiaron mucho la API y la forma en que funcionan los javaws. Necesito decir: quédate con java8 si quieres usar aplicaciones JNLP envueltas.


De un hilo de correo electrónico con soporte técnico de Apple, parece que la palabra oficial es usar la herramienta xip para evitar la dependencia de los atributos extendidos de HFS con codesign :

En lugar de los códigos, use xip (pronunciado "chip") para crear un archivo firmado de su archivo JNLP. Proporcione su identidad de Instalador de ID de Desarrollador como el argumento de la opción --sign, no su identidad de Aplicación de ID de Desarrollador.

Un archivo xip es esencialmente un archivo zip firmado, por lo que se puede servir a través de Internet de la misma manera que un archivo zip. Se desarchivará automáticamente en el cliente Mac.

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xip.1.html

Desde mi experimentación, la herramienta xip siempre genera un archivo con el jnlp contenido en una carpeta cuando se ejecuta.


Hemos podido determinar que puede firmar un archivo jnlp con codesign, utilizando el Certificado de "Aplicación de Identificación de Desarrollador", como este:

codesign -f -s "Developer ID Application: " foo.jnlp

El resultado de esta operación parece pasar a Gatekeeper en la máquina local. Sin embargo, parece que la firma se almacena como atributos HFS extendidos y, como resultado, no se transmite si un usuario obtiene el archivo de una transacción HTTP.

Podría funcionar si tomó el archivo .jnlp y lo empaquetó en algún tipo de contenedor, como un .dmg o tal vez un .tar.gz, sin embargo, es mucho trabajo y proporciona una experiencia de usuario bastante desafiante.


Sólo para resumir la discusión; Actualmente no existe una solución sobre cómo solucionar esto.

Esto significa que los usuarios finales no pueden iniciar una aplicación a través de JNLP fácilmente. Básicamente, uno necesita decirle al usuario que haga clic con el botón derecho y abra para anular el Gatekeeper.

La otra solución sería crear una aplicación Mac firmada y que los usuarios la instalen a través de la imagen del disco.