[Nota traducci贸n: traduciendo la publicaci贸n que caus贸 una gran discusi贸n sobre Habr茅, me interesaron las nuevas reglas para desarrolladores de software introducidas por Apple. Este art铆culo habla sobre la experiencia personal de dominar las reglas con uno de los desarrolladores del juego.]Introduccion
En la nueva versi贸n de macOS, Apple estableci贸 ciertos requisitos para las aplicaciones que sol铆an ser recomendaciones: archivos ejecutables de 64 bits, firma y certificaci贸n notarial. Las aplicaciones que no cumplan con estos requisitos ya no se iniciar谩n.
Esto se hace para proteger el trabajo de los usuarios y evitar la propagaci贸n de programas maliciosos, pero al mismo tiempo hace la vida muy dif铆cil, especialmente para aquellas personas para quienes Mac no es la plataforma principal de desarrollo, pero que sin embargo desean comenzar o continuar apoyando Mac .
Esto es especialmente cierto para los desarrolladores de juegos que publican juegos de Mac en Steam. Hasta los cambios recientes, los juegos lanzados desde Steam no necesitaban firmar y notarizar, pero ahora deben obedecer las mismas reglas que todos los dem谩s.
Acabo de descubrir c贸mo implementar estos requisitos para mi juego de
Dirigibles: Conquer the Skies . Las aeronaves funcionan en Java y, por lo tanto, requieren una JVM, pero en general, todo lo dem谩s ser谩 aplicable a la mayor铆a de los desarrolladores.
Esto es lo que aprend铆 sobre la firma y la certificaci贸n ante notario de una aplicaci贸n Mac que no fue compilada directamente por Xcode. Tenga en cuenta que la informaci贸n se obtiene de mi propia investigaci贸n y puede no ser 100% precisa.
Preguntas y correcciones son bienvenidas. Antecedentes
Este art铆culo aborda la firma y la notarizaci贸n. Obtener el archivo ejecutable de 64 bits del programa es tarea de su compilador o entorno de desarrollo.
En macOS, las aplicaciones generalmente se empaquetan en paquetes: carpetas que contienen el ejecutable, as铆 como recursos y metadatos adicionales. Firmar un paquete significa crear una suma de verificaci贸n criptogr谩fica del contenido del paquete, seguido de crear una firma criptogr谩fica con un certificado que Apple emite al desarrollador. Una firma es una declaraci贸n de que usted garantiza personalmente el comportamiento correcto de la aplicaci贸n. Si el contenido del paquete cambia, la suma de verificaci贸n cambia y la firma deja de corresponderles, advirtiendo al sistema operativo que se han realizado cambios no autorizados al paquete.
La firma de solicitudes ha existido por muchos a帽os. Un poco m谩s tarde, las solicitudes tambi茅n se hicieron necesarias para notarizar. La notarizaci贸n significa que usted env铆a una solicitud firmada de Apple, y la compa帽铆a realiza verificaciones adicionales y registra la aplicaci贸n. Si la notarizaci贸n es exitosa, usted "adhiere" la notarizaci贸n a su solicitud, de modo que las m谩quinas fuera de l铆nea sin acceso a Internet tambi茅n puedan asegurarse de que la solicitud haya sido notariada.
Este es un tipo de met谩fora para trabajar con documentos en papel. El desarrollador recopila en un paquete todas las partes que componen la aplicaci贸n. Luego crea una lista de todos los elementos del paquete (suma de verificaci贸n) y firma esta lista (con una firma digital), que pega al paquete. Luego le pasa el paquete firmado al notario Sr. Yablokov, quien verifica si todo est谩 en orden con el paquete, y luego lo registra. Le da al desarrollador un recibo que la grapadora adjunta al paquete. Es decir, si el desarrollador dijo que la aplicaci贸n es segura, y el Sr. Yablokov tambi茅n dice que es segura, entonces lo m谩s probable es que lo sea. Y si una persona mala intenta cambiar su contenido, la lista de elementos del paquete dejar谩 de corresponderle y el usuario sabr谩 que no es necesario usarlo.
Requisitos
Lo que es necesario para firmar y notarizar la solicitud:
- Una computadora Mac que es lo suficientemente nueva como para ejecutar Xcode 11 en ella, es decir, lo suficientemente nueva como para ejecutar macOS 10.14.3. Si a煤n no ha instalado Xcode, se requieren 25 GB de espacio libre para la instalaci贸n.
- Si a煤n no es un desarrollador oficial de Apple, se requiere un inicio de sesi贸n de ID de Apple y aproximadamente $ 110 para la membres铆a.
Autenticaci贸n de dos factores
Si a煤n no tiene uno, habilite la autenticaci贸n de dos factores para su ID de Apple. Esto se puede hacer desde cualquier dispositivo i o desde una Mac. En una Mac, vaya al panel de control de iCloud de la configuraci贸n de Preferencias del sistema. En la parte superior deber铆a haber un panel que sugiera habilitar 2FA.
Compra de membres铆a
Inicie sesi贸n en
https://developer.apple.com/ con su ID de Apple y vaya a la pesta帽a Membres铆a. Compre o actualice su membres铆a del Programa de Desarrolladores de Apple si es necesario. Tenga en cuenta que el procesamiento de una compra lleva alg煤n tiempo en los sistemas internos de Apple, por lo que si no puede generar certificados (consulte a continuaci贸n), tome una taza de t茅 por un tiempo y rel谩jese.
Identificaci贸n de la aplicaci贸n
Es posible que deba registrar la ID del paquete de la aplicaci贸n en el backend del desarrollador. El ID del paquete se puede encontrar en YourApp.app/Contents/Info.plist. (Puede abrir paquetes de aplicaciones haciendo clic derecho sobre ellos y seleccionando "Mostrar contenido del paquete"). El identificador debe ser com.yourcompanyname.applicationname, por ejemplo, mi juego Airships tiene com.zarkonnen.airships.
Para registrar una ID, inicie sesi贸n en
https://developer.apple.com/ , seleccione "Certificados, ID y perfiles" en el panel izquierdo y luego seleccione "Identificadores" en la p谩gina siguiente. Luego puede hacer clic en el bot贸n "+" para agregar el identificador de la aplicaci贸n.
Contrase帽a de la aplicaci贸n
Para firmar desde la l铆nea de comandos, necesitar谩 la contrase帽a de la aplicaci贸n, as铆 que vaya a
https://appleid.apple.com/account/manage y generarla.
Xcode y herramientas
Instale Xcode a trav茅s de la tienda de aplicaciones de la aplicaci贸n Mac. Luego instale tambi茅n las herramientas de l铆nea de comandos Xcode de
https://developer.apple.com/download/more . Necesita las herramientas de l铆nea de comandos para Xcode 11 o la versi贸n de Xcode que est谩 utilizando.
Certificado
Inicie Xcode, vaya a Preferencias, abra la pesta帽a Cuentas. Si es necesario, agregue su ID de Apple a la lista de cuentas. Luego haga clic en el bot贸n "Administrar certificados ..." en la esquina inferior derecha. Se muestran los certificados que tiene para firmar aplicaciones. Necesita un certificado de "Aplicaci贸n de ID de desarrollador"; Si no est谩 en la lista, cr茅elo. Haga clic en "Listo" y luego en "Descargar" en la ventana Preferencias: Cuentas para descargar los certificados localmente.
Preparaci贸n de la solicitud
Para que la aplicaci贸n funcione correctamente en el nuevo sistema, el archivo ejecutable y las bibliotecas deben ser de 64 bits.
Adem谩s, Mac OS realiza una operaci贸n llamada "translocaci贸n": por razones de seguridad, mueve el paquete de aplicaciones en ejecuci贸n a una ubicaci贸n aleatoria. En el caso de mi aplicaci贸n, esto se manifest贸 en el hecho de que no pod铆a encontrar los archivos de datos ubicados al lado del paquete de la aplicaci贸n. Puede obtener la ubicaci贸n original del paquete de la aplicaci贸n, pero resolv铆 el problema simplemente colocando todo en el paquete.
Permisos (derechos)
Estos son permisos especiales agregados por el desarrollador junto con la firma de c贸digo, lo que permite que las aplicaciones firmadas realicen ciertas acciones. Si compila la aplicaci贸n usando Xcode, har谩 todo por s铆 mismo; de lo contrario, deber谩 crear un archivo plist que contenga todos los derechos que necesita. Los archivos Plist se pueden crear usando Xcode, y en
https://developer.apple.com/documentation/bundleresources/entitlements hay una lista de derechos.
Para crear un nuevo archivo plist usando Xcode, seleccione "Nuevo archivo" y luego haga clic en "Lista de propiedades" en la lista que aparece. Agregue los elementos con derechos que necesita al diccionario ra铆z; tienen los significados booleanos: SI.
En el caso de mi juego, ya que est谩 escrito en Java, necesitaba los siguientes permisos para que la JVM funcione: com.apple.security.cs.allow-jit, com.apple.security.cs.allow-unsigned-ejecutable-memory, com. apple.security.cs.disable-ejecutable-page-protection, com.apple.security.cs.disable-library-validation, com.apple.security.cs.allow-dyld-environment-variables. Parecen intimidantes para el usuario, por lo que si no los necesita, no los agregue.
M谩s adelante en el art铆culo asumiremos que ha colocado sus derechos en un archivo llamado titulo.plist.
Firma
Este es el proceso de creaci贸n de una firma digital que informa: el que tiene acceso al certificado de firma promete que este paquete de aplicaciones en particular es confiable y no malicioso. Cualquier cambio en el paquete de la aplicaci贸n (excepto para adjuntar una confirmaci贸n de notarizaci贸n, ver arriba) despu茅s de firmarlo invalida la firma y requiere volver a firmar el paquete.
Esto tambi茅n significa que su aplicaci贸n no debe cambiar nada en el contenido del paquete de la aplicaci贸n, por ejemplo, no coloque un cach茅 all铆.
Cada archivo ejecutable y biblioteca din谩mica en el paquete de aplicaciones se firman por separado. En algunos casos, las bibliotecas ya pueden estar firmadas. Es decir, es m谩s cort茅s y tranquilo firmar un paquete firmando cada elemento por turno y luego firmar el paquete completo. Si alg煤n elemento ya tiene una firma, permanecer谩 en su lugar.
Una forma tosca pero efectiva es forzar la firma profunda, es decir, su firma se aplicar谩 a todos los elementos del paquete de aplicaciones, reemplazando todas las firmas anteriores. Esto es exactamente lo que haremos, porque es m谩s simple y porque las firmas anteriores pueden ser inv谩lidas o no lo suficientemente fuertes.
Necesitar谩s el siguiente comando de miedo:
codesign -s "Developer ID Application: <YourName>" --timestamp --options runtime -f --entitlements entitlements.plist --deep YourApp.app
La opci贸n -
--timestamp
significa que una marca de tiempo v谩lida, que es necesaria para una notarizaci贸n exitosa, est谩 incrustada con la firma.
La opci贸n
--options runtime
significa que la firma incluye "tiempo de ejecuci贸n reforzado", que tambi茅n es necesario para una notarizaci贸n exitosa.
Puedes aprender la firma del equipo
codesign -d -vvvv YourApp.app
Tambi茅n debe ejecutar la aplicaci贸n para asegurarse de que contin煤a funcionando despu茅s de firmar.
Si desea firmar elementos de una manera m谩s educada, elimine los comandos
-f
y
--deep
del comando, primero firme todos los archivos ejecutables y bibliotecas dentro de la aplicaci贸n, y luego toda la aplicaci贸n.
Notarizaci贸n
Despu茅s de firmar la solicitud, debe proporcionarla a los sistemas de Apple para la certificaci贸n notarial a fin de decir: "Mira, firm茅 esta cosa".
Para hacer esto, primero comprima la aplicaci贸n en un archivo zip especial usando el comando ditto:
/usr/bin/ditto -c -k --keepParent YourApp.app YourApp.zip
Simplemente envolver la aplicaci贸n en zip usando Finder o la l铆nea de comando no funcionar谩.
Luego env铆e una postal para la notarizaci贸n:
xcrun altool --notarize-app --primary-bundle-id "<id>" -u "<appleid>" -p "<app-specific password>" --file YourApp.zip
Un ejemplo:
xcrun altool --notarize-app --primary-bundle-id "com.zarkonnen.airships" -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx" --file Airships.zip
El ID del paquete se puede encontrar mirando YourApp.app/Contents/Info.plist. (Puede abrir paquetes de aplicaciones haciendo clic derecho sobre ellos y seleccionando "Mostrar contenido del paquete").
La notarizaci贸n puede llevar bastante tiempo. Esto suele ser unos segundos o minutos, pero a veces puede ser una hora. Vi茅rtase m谩s t茅, o algo m谩s fuerte, elija usted mismo. Tarde o temprano obtendr谩s algo como esto:
No errors uploading 'YourApp.zip'.
RequestUUID = 29926ae6-f551-4d54-b283-e29d6f9b9156
Ahora podemos usar el siguiente comando para verificar el estado del paquete transmitido:
xcrun altool --notarization-info <RequestUUID> -u -u "<appleid>" -p "<app-specific password>"
Un ejemplo:
xcrun altool --notarization-info 29926ae6-f551-4d54-b283-e29d6f9b9156 -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx"
Algo similar se mostrar谩:
Fecha: 2019-10-08 06:59:58 +0000
Hash: 0774fb95035408bacecebd64935a611ecd27b45ad9cbf3cc1aa48fa1e0eaa649
LogFileURL: https: //osxapps-ssl.itunes.apple.com/itunes-assets/Enigma123 / ...
Estado: 茅xito
C贸digo de estado: 0
Mensaje de estado: paquete aprobado
Repito, la confirmaci贸n suele tardar unos 15 minutos, pero a veces tarda varias horas para la misma aplicaci贸n. Si, asi.
Si el estado es un error, vea los errores enumerados por la URL del archivo de registro. Si obtiene 茅xito, eche un vistazo de todos modos, porque puede haber advertencias, y estas advertencias pueden convertirse en errores cuando Apple vuelva a ajustar sus requisitos.
Adjunto
Finalmente, "sujetaremos" la confirmaci贸n de la certificaci贸n notarial al paquete de aplicaciones para que incluso una Mac pueda verificarla sin una conexi贸n a Internet. Para hacer esto, debe ejecutar un comando sorprendentemente corto:
xcrun stapler staple "YourApp.app"
Enhorabuena, te has registrado y notarizado la aplicaci贸n Mac. Ahora puede distribuir el paquete de aplicaciones de la manera que le resulte conveniente si no cambia en el proceso.
Java
Si est谩 en el mismo barco que yo y necesita agregar al paquete con la aplicaci贸n JVM, contin煤e leyendo.
Hay varias opciones para combinar un paquete JVM con una aplicaci贸n Java. Recomendar铆a el AppBundler, que es una tarea de hormigas que hace todo el trabajo por usted. Inicialmente, el AppBundler se pod铆a descargar de java.net, pero gracias a la negligencia de Oracle del resto de la plataforma Java, ahora debe descargar la 煤ltima versi贸n de
https://github.com/TheInfiniteKind/appbundler .
All铆 puede encontrar las fuentes y la documentaci贸n, pero no jar, porque se supone que est谩 utilizando Maven. Si no est谩 utilizando Maven, puede tomar el frasco desde aqu铆:
https://jar-download.com/artifacts/com.panayotis/appbundlerSiga las instrucciones en la documentaci贸n en la p谩gina de github para configurar el paquete. Personalmente, uso NetBeans, y para resolver el problema, insert茅 las siguientes l铆neas en build.xml:
<target name = "- post-jar">
<taskdef name = "bundleapp"
classpath = "lib / appbundler-1.1.0.jar"
classname = "com.oracle.appbundler.AppBundlerTask" />
<bundleapp
jvmrequired = "1.7"
outputdirectory = "/ home / zar / Desktop"
nombre = "Dirigibles"
displayname = "Dirigibles"
ejecutableName = "Dirigibles"
identificador = "com.zarkonnen.airships"
shortversion = "1"
version = "1"
mainclassname = "com.zarkonnen.airships.Main"
copyright = "2019 David Stark"
applicationCategory = "public.app-category.games">
<classpath dir = "dist" />
<runtime dir = "/ home / zar / Desktop / jdk-11.0.4.jdk / Contents / Home" />
<arch name = "x86_64" />
<option value = "- Dapple.laf.useScreenMenuBar = true" />
<option value = "- Dcom.apple.macos.use-file-dialog-packages = true" />
<option value = "- Dcom.apple.macos.useScreenMenuBar = true" />
<option value = "- Dcom.apple.mrj.application.apple.menu.about.name = Aeronaves" />
<option value = "- Xdock: name = Airships" />
<option value = "- Dcom.apple.smallTabs = true" />
<option value = "- Dfile.encoding = UTF-8" />
<option value = "- Xmx1024M" name = "Xmx" />
</bundleapp>
</target>
Esta es la tarea realizada despu茅s de crear el archivo jar. Utiliza appbundler-1.1.0.jar para crear un paquete de aplicaciones con una JVM integrada.
El JDK que utilizo puede descargarse de
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html . Eleg铆 la versi贸n 11 porque tiene LTS (soporte a largo plazo), pero usa los viejos t茅rminos de licencia de Oracle, mientras que la versi贸n 13 tiene un nuevo y extra帽o conjunto de restricciones de licencia.
Tambi茅n hay m谩s JVM OpenJDK legalmente libres, pero no pude hacer que funcionen con el paquete de aplicaciones.
Nota: JVM es "M谩quina virtual Java". JRE es un "Java Runtime Environment" que incluye JVM m谩s elementos adicionales, como el actualizador de Java. JDK es un "Kit de desarrollo de Java" que consta de un JRE m谩s las cosas necesarias para escribir programas Java, como un compilador. Antes de Java 8, el JRE estaba disponible para los usuarios finales por separado, pero desde entonces solo el JDK ha estado disponible y, por lo tanto, asociamos el entorno de desarrollo de Java con un juego de computadora.
Deber铆a poder firmar y notarizar profundamente el paquete resultante. La documentaci贸n de AppBundler tiene un mont贸n de opciones adicionales, como agregar un icono, asociaciones de tipo de archivo y generar una JVM simplificada para la aplicaci贸n.
Lectura adicional
Adem谩s
- El usuario de Reddit AMemoryOfEternity hizo una pregunta en los foros de desarrolladores de Steam y result贸 que si bien las notificaciones para las aplicaciones de Steam no son necesarias. Deben ser de 64 bits, pero no est谩 claro si es obligatorio firmarlos. Enlace, requiere acceso a Steamworks
- Apple ha relajado temporalmente las reglas de notarizaci贸n, por lo que por ahora le permite certificar ante notario las aplicaciones que no tienen un tiempo de ejecuci贸n reforzado, tienen subcomponentes, no tienen una identificaci贸n de desarrollador, no tienen marcas de tiempo, etc. Tales cosas se seguir谩n mostrando en el informe de notarizaci贸n como advertencias, por lo tanto, para cuidar el futuro, es mejor tratar de deshacerse de ellas.
- Seg煤n Valve, para que la API de Steam funcione, debe otorgar el derecho com.apple.security.cs.allow-dyld-environment-variables: "Steam inyecta la API dylib a trav茅s de DYLD_INSERT_LIBRARIES, que est谩n bloqueados de forma predeterminada por el tiempo de ejecuci贸n reforzado, pero la propia API dylib est谩 firmada y debe verificarse, as铆 que simplemente agregue el permiso "com.apple.security.cs.allow-dyld-environment-variables" para poder asignar variables de entorno DYLD ".