Mountain Lion, Gatekeeper, y aplicaciones Java rotas

Si utilizáis alguna aplicación basada en Java, y la habéis instalado en Mountain Lion con Gatekeeper en su configuración estándar (sólo permitir aplicaciones de la Mac App Store, o de desarrolladores reconocidos), al intentar ejecutarla os habréis encontrado con un mensaje como el siguiente:

Aladin.app dañado

La causa detallada la explicaremos en la siguiente sección, pero, en breve, se trata de que una parte de la aplicación Java, proporcionada por Apple para proporcionar cosas como una imagen inicial, o un icono de aplicación en el Dock, no está debidamente firmada (viene firmada por Apple, pero la firma no corresponde al resto de la aplicación), y Mountain Lion informa de ella como rota. ¿Cómo solucionarlo?

Eliminar com.apple.quarantine

Si queremos un tratamiento sintomático, podemos recurrir, simplemente, al borrado de la “marca de cuarentena”. Desde Snow Leopard, el Mac marca los archivos que se descargan con un atributo especial, la “marca de cuarentena”. Consiste un un atributo de archivo extendido que las aplicaciones añaden a la aplicación. Podemos comprobarlo con un simple comando ls:

$ ls -ld Aladin.app
drwxr-xr-x@ 3 jdsant  staff  102  2 oct  2012 Aladin.app

La @ indica que el archivo tiene atributos extendidos, que podemos ver con el comando xattr:

$ xattr -l Aladin.app
com.apple.quarantine: 0002;5220ec9e;Safari.app;CDBE66EA-B7F6-48D9-8878-6196524B93C2

El resultado anterior indica que la “marca de cuarentena” se llama, en realidad, com.apple.quarantine, y el contenido indica, en diferentes campos separados por punto y coma (;):

  • 0002: 2 bytes para indicar (posiblemente) el número de descargas del archivo
  • 5220ec9e: 4 bytes (32 bits) para indicar, en una marca de tiempo, el momento exacto en que se descargó el archivo
  • Safari.app: Cadena que indica la aplicación que descargó la aplicación (en este caso, Safari)
  • CDBE66EA-B7F6-48D9-8878-6196524B93C2 es un UUID que se registra en la base de datos de eventos de cuarentena, <tt>~/Library/Preferences/com.apple.LaunchServices.QuarantineEvents</tt>.

Basta con que eliminemos la marca de cuarentena (el atributo com.apple.quarantine) para que desaparezca el problema. Podemos hacerlo con el terminal:

xattr -d com.apple.quarantine Aladin.app

donde habría que cambiar Aladin.app por la aplicación de que se trate.

Eliminar la firma errónea

En realidad, el mensaje que muestra el Finder al intentar abrir la aplicación indica que la aplicación está dañada: esto es, que su firma se ha visto comprometida. El problema es que hay una parte de las aplicaciones Java que se empaquetan como aplicaciones Mac OS X, JavaApplicationStub, que ya viene firmada por Apple. Pero ese contenido cambia durante la compilación, por lo que la firma siempre aparecerá como rota. Lo ideal sería que los desarrolladores firmaran también las aplicaciones Java para Mac OS X con un certificado de Apple, de modo que GateKeeper no pondría reparos, y dejaría que se ejecutara la aplicación.

Sin embargo, no se puede pedir que todos los desarrolladores obtengan una firma de Apple. Sin embargo, sí que es posible que, al menos, utilicen una funcionalidad de firma ad-hoc disponible en la utilidad codesign, de modo que el mensaje no sea de aplicación dañada, sino de aplicación de origen desconocido.

Para ello, los desarrolladores deben firmar las aplicaciones de la siguiente forma:

codesign -s - --force Aladin.app

de nuevo, cambiando Aladin.app por la aplicación que corresponda. En este caso, -s - representa la firma ad-hoc, en lugar de seleccionar una firma particular.

Si se firma la aplicación de esa forma, el diálogo que se obtiene es el tradicional para otras aplicaciones:

Aladin-descargado

Por supuesto, es posible también realizar esa operación no sólo con las aplicaciones que uno está programando, sino con las aplicaciones de terceros, pero eso implica disponer de las herramientas Xcode (codesign no está instalada si no se instala Xcode previamente).

Referencias

La inspiración de este artículo es esta entrada en Mac OS X Hints:

Descubre más desde Memoria de Acceso Aleatorio

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo