Etiqueta

24 mayo 2019

Creación de paquetes firmados para la instalación de aplicaciones Omnis en MacOS

Este documento explica cómo hacer lo siguiente:
  1. Preparar tu "First Run Install" con los archivos propios de la aplicación.
  2. Instalar los ficheros .df1 en modo de sólo-lectura.
  3. Crear tu propio "package" (.pkg) de instalación.
  4. Colocar "script's" dentro del "package".
  5. Construir el "package", desde una opción de menú o mediante Cmd+B.
  6. Firmar el "package" resultante, para su distribución.
  7. Probar su carga/descarga, instalación y ejecución.

Antes debo explicarte que realmente existen dos tipos de firmas, una es la "Firma de la aplicación" (Application Signing) y la otra la "Firma del producto" (Product Signing). Ambos tipos pueden ser obtenidos tras registrarte como desarrollador en Apple. ($99 dólares anuales)

De modo que lo primero es convertirse en un desarrollador registrado, para después obtener su certificado. Hacerlo desde Xcode es más fácil que hacerlo manualmente desde la web, pero de todos modos se trata de un proceso realmente sencillo.

Ahora te contaré cómo se hace, si el caso es que no vas a usar Xcode. Lo primero es, que tendremos que hacer uso de tu cuenta en Apple, esa misma que usas para comprar cosas en iTunes o en la App Store. Si no tienes una, tendrás que registrarse para obtenerla.

Lo primero será iniciar sesión con tu cuenta de Apple. Una vez allí, localiza el enlace al "Programa de Desarrolladores" (Developer Program) o al de "Desarrollador Registrado" (Registered Developer). Una vez allí podrás realizar el registro como nuevo desarrollador Apple. Una vez completado el proceso, (es posible que la nueva cuenta tarde un poco en activarse) podremos solicitar certificados.

Localiza el enlace a Certificados (Certificates). Desde aquí podrás solicitar certificados, indicándote también cómo proceder. Observarás que se hace uso del "Keychain Access" (Acceso a llaveros) durante la creación de certificados. Observa también que la página web muestra un menú en la esquina superior izquierda, donde figuran en primer lugar dispositivos iOS, deberemos cambiarlo a MacOS para obtener así el certificado correcto.

Una vez seleccionado MacOS podrás ver sus opciones. Deberemos escoger aplicaciones o instaladores que no estarán en la tienda de aplicaciones (App Store). A partir de ahí, verás que debes elegir entre un certificado para aplicaciones que están en desarrollo o para las ya en producción, elige producción (Production). Luego verás que tienes que elegir entre aplicaciones (Applications) o instaladores (Installers). Elige instalador, porque es el que necesitamos para firmar nuestro .pkg.

Descubre que en la parte inferior de la página, hay un lugar donde hacer clic para obtener un "Certificado Intermedio" (Intermediate Certificate). Este también es necesario, ya que causa que los demás se ejecuten correctamente. Así que obtén el denominado "WW Developers", sin marcar la opción "CA Authority".

Ahora descubrirás que necesitas generar un "Cert. request" desde el "Keychain Access" de tu Mac, después tendrás que subirlo a la web de Apple, para finalmente poder descargar nuestro certificado. Lo que se descarga es un certificado digital que deberás instalar también en el "Keychain Access" de tu Mac, para esto, bastará con hacer doble clic sobre el certificado que acabas de descargar.

Haz que tus certificados se carguen al inicio de sesión (Login Keychain), es una de las tres opciones que se muestran en la ventana tras el dobre-click. También el propio "Keychain Access" muestra un pequeño menú en la esquina superior izquierda, desde el que poder elegir "Login keychain" para el nuevo certificado.

Los certificados se guardan en el "Keychain Access" y son necesarios para verificar tu identidad. Al fin y al cabo, se trata de poner tu firma en tus productos de modo que otros puedan verificar su procedencia.

Una vez que tengas los dos certificados instalados, estarás listo para firmar los instaladores (Productos). Realmente lo único que los desarrolladores de Omnis necesitamos en este momento es la firma de instalador (Installer). Pero también podemos volver a firmar la aplicación Omnis.

Por aplicación, debemos entender una copia completa del paquete Omnis instalado, que lleva la extensión ".app". Mientras que por instalador debemos entender que se trata de un "Package" con extensión ".pkg" y no de orto tipo de instaladores más sofisticados de los que guían al usuario durante la instalación, mientras le muestran algunas imágenes.

Realmente a un desarrollador Omnis (de momento) le vastará con preocuparse por firmar su instalador, y añadir alguna que otra secuencia de comandos que permita ajustar después de la instalación algunas propiedades y cambiar algunos permisos.

En este momento, Apple no obliga a que la aplicación tenga el código firmado para poder ejecutarse, si el caso es que se instala desde un paquete firmado, ten en cuanta que si firmas la aplicación, no podrás cambiar nada dentro de ella sin volver a firmarla. Si alguna vez Apple requiere que la aplicación esté firmada, los desarrolladores de Omnis tendremos que enviar instaladores completos.

La firma deberá llevarse a cabo desde la línea de comandos del terminal y deberá realizarse una vez construido el instalador, este será modificado mediante el comando correspondiente, para incluir tu seña de identidad.

Omnis requiere de la ejecución de un "script" que corrija permisos y, en ocasiones, propiedades de todos los archivos contenidos en el paquete. Este script es muy simple, solo unas pocas líneas de código. La razón por la que debe ejecutarse tras la instalación es debido a que los permisos y las propiedades deben cambiarse, de otro modo el programa fallará y no podrá ejecutarse con normalidad. Crearemos un script para Omnis 4.3 y otro para Omnis Studio 8. Lo más probable es que el script para 8 también funcione para 10 y que el de 4 funcione para 5 y 6.

Para la creación del instalador o .pkg, usaremos "Packages" disponible en:

  
El botón de descarga se encuentra en la esquina superior derecha.

Primero, si tienes archivos ".df1", asegúrate de "Obtener información" (Comando-I) de cada uno de ellos, para marcarlos "Todos" con acceso de "Lectura/Escritura" y situarlos bajo "First Run Install" si se usa.

Después crearemos nuestro "package", simplemente mediante colocar los elementos a instalar sobre el área "Payload" (Carga útil) de "Packages". Ten en cuenta que si quieres que algo quede situado sobre el nivel raíz del disco duro, deberás arrastrarlo a la parte superior, hasta que veas que la línea se desplaza totalmente hacia la izquierda, luego la sueltas, junto a otras posibles cosas que también se deban encontrar en ese mismo nivel.

Ten en cuenta que pueden existir carpetas ocultas. Para verlas, busca en uno de los menús la opción "Show hidden folders". Esto mostrará, (entre otras cosas) una carpeta "fonts" que podrás usar para instalar fuentes... simplemente colócalas con sangría debajo del nombre de esa carpeta, debajo de "fonts" y se instalarán correctamente.

Entra en "Packages Destination" y selecciona la carpeta "First Run Install" de Omnis y su destino, puedes colocar los archivos donde quiera que vayan. Algunos estarán a su vez, en otras carpetas dentro de "First Run Install", la cual es a su vez es una carpeta dentro de Omnis (para localizarla, haz clic con el botón derecho sobre Omnis y "Mostrar contenido del paquete" - luego "Contents", después "MacOS", y encontrarás la carpeta "First Run Install"). Dentro de ésta es donde deberás poner todas tus cosas. Cuando el usuario ejecute Omnis por primera vez, todos su contenido será copiado en los destinos mencionados.

Cuando ya tengas colocados todos los ficheros y carpetas en el lugar que le corresponden dentro de Omnis, deberemos colocar el propio Omnis y cualquier otra cosa que necesitemos en el área "Payload" (Carga útil) de "Packages", de éste modo estaremos listos para construir nuestro paquete. Observa que dispones de muchas opciones, pero ninguna de ellas necesaria durante la construcción de un paquete básico como el nuestro. Claro que no es imprescindible hacer todo esto para instalar una aplicación, pero el uso de "Packages" proporcionará al usuario una experiencia de instalación más profesional.

Una vez que creado, podremos ver un pequeño ícono de caja y será ahora cuando deberemos proceder con el proceso de firma del Producto (Product Sign) mediante comandos de Terminal, después lo probaremos, comprobaremos que podemos cargarlo/descargarlo, que el proceso de verificación "Apple Gatekeeper", funciona correctamente y que la aplicación Omnis puede ser ejecutada sin problemas.

Un truco para ahorrarnos trabajo en el terminal, consiste en arrastar cualquier archivo sobre la ventana de éste, para así obtener la ruta hacia el mismo ya escrita sobre la línea de comandos.

Otra forma de hacerlo es escribiendo la ruta entre comillas dobles, para no necesitar escapar de los espacios u otros caracteres especiales. Por ejemplo escribiendo:

"/Users/Das's/Desktop/JyotishStudio4.pkg"

Algunos comandos de Terminal solicitarán tu contraseña, si te aparece un pequeño candado como cursor en el Terminal, significará que debes escribir tu contraseña de administrador para completar el comando. En algunos casos, puede que se te muestre un cuadro de diálogo solicitando esta misma contraseña.

Aquí está el comando que debes usar para firmar el "Package":

productsign --sign "Developer ID Installer: Das Goravani" /Users/Das\'s/Desktop/build/JyotishStudio4.pkg /Users/Das\'s/Desktop/JyotishStudio4signed.pkg

Realmente el comando consiste en la primera parte solamente, hasta el nombre del desarrollador. El resto son DOS rutas. LA PRIMERA es la ruta hacia el paquete que queremos firmar, sólo UN ESPACIO la separa del nombre del desarrollador y de la segunda ruta indicada. La segunda ruta corresponde a un nuevo archivo que se creará. Será un duplicado de nuestro paquete pero con la firma incluida. El original permanecerá coo estaba.

Si has escrito todo correctamente, al presionar retorno, se firmará tu aplicación y se creará el nuevo archivo cono nuestro instalador ya firmado. Ahora todo lo que queda resta, es probarlo, cosa que puedes hacer de inmediato, cono sólo hacer doble clic sobre él o bien empezar por subirlo a algún sitio para después descargarlo y luego instalarlo.

Su ejecución no será exitosa, a menos que pongamos antes nuestro "Post Process Script". El script deberemos ubicarlo (como ya hemos indicado) desde el programa "Packages" en el apartado "Post Install" pestaña "Scripts". Podemos simplemente arrastrarlo, para soltarlo sobre "Post Install" para ver su icono allí.

El "script" necesario para Omnis 4, 5 o 6, sería el siguiente:
#!/usr/bin/env bash
# Este script se ejecuta una vez instalada la aplicación.
# Indica la ruta hacia tu aplicación
APPLICATION_ROOT="/Jyotish Studio 4.0/JS4.app"
# Estabece permisos
sudo chown -R root:admin "${APPLICATION_ROOT}"
sudo chmod -R 775 "${APPLICATION_ROOT}"
Crea un documento de TEXTO PLANO, con estas líneas y guárdalo, para después añadirlo a tu instalador como ya se ha descrito. Se ejecutará después de la instalación, establecerá todos los permisos y propiedades haciendo que el programa se ejecute correctamente.

Para Omnis 8:
#!/usr/bin/env bash
# Este script se ejecuta una vez instalada la aplicación.
# Indica la ruta hacia tu aplicación
APPLICATION_ROOT="/Applications/Omnis Studio Runtime 8.0.2 x64.app"
# Estabece permisos
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/startup"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/icons"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/iconsets"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/local"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/omnispdf"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/studio"
# Para Brainy Data's PDFDevice (omitir si no se usa)
sudo chmod a+rw ../MacOS
Quiero dar las gracias en especial a Das Goravan, Paul Mulrooney y Alex Clay por el trabajo realizado y su aportación a éste documento.