Procedimiento de notificación para aplicaciones Electron para macOS 10.14.5

Con el lanzamiento de macOS 10.14.5, Apple agregó un proceso de Notarización obligatorio para las aplicaciones antes de distribuirlas. Me gustaría decirle qué es y qué dificultades surgieron con esta actualización al desarrollar en Electron.js.



Introduccion


2 años después del auge de Electron.js, todos los comentarios sobre lo malo que es y por qué se necesita son silenciosos. No los reavivemos en los comentarios. Gracias


Nuestro proyecto utiliza el generador de electrones para construir la aplicación, pero para el empacador de electrones este procedimiento será aproximadamente el mismo.


El proyecto en sí es un lanzador para juegos en la nube, a través del cual se lanza un cliente nativo para acceder a una computadora remota.


Firmar una solicitud con el generador de electrones no parece complicado, pero en aras de la exhaustividad, hablaré brevemente sobre este procedimiento. Si no tiene problemas para firmar la aplicación, puede omitir este capítulo.


Firma de solicitud


Para firmar la aplicación, necesitamos exportar certificados desde la cuenta personal del desarrollador de Apple. Necesitaremos:


  • Solicitud de ID de desarrollador
  • Instalador de ID de desarrollador
  • * Aplicación de desarrollador de Mac de terceros e instalador de desarrollador de Mac de terceros (si planea publicar la aplicación en la AppStore)

El certificado de instalador de ID de desarrollador se emite para una aplicación específica, para este paquete se requiere ID. Para el generador de electrones, se especifica mediante el parámetro appId en package.json



Los certificados deben recopilarse en un solo archivo. Para hacer esto, agréguelos al llavero (2 clics en el certificado).
Luego vamos al llavero, seleccionamos los certificados necesarios y hacemos clic en "exportar elementos" en el menú contextual. Después de la exportación, obtenemos un archivo con la extensión .p12.



Después del archivo de certificado recibido, agregue las siguientes entradas a las variables de entorno


  • CSC_LINK (ruta al archivo de certificado .p12)
  • CSC_KEY_PASSWORD (contraseña de acceso al certificado)

Si no agrega estas variables, el recopilador buscará automáticamente las claves adecuadas en el repositorio de llaveros. Agregar estas entradas le permite identificar los certificados que desea usar para firmar.


Después de estas operaciones, puede iniciar el proceso de compilación y todo debería funcionar sin problemas.


Esto funcionó sin problemas hasta que se lanzó macOS 10.14.5 ...


Lo que ha cambiado con macOS 10.14.5


Una pequeña digresión. Al realizar el último trabajo en el nuevo parche por la noche, decidí dejar el ensamblaje de la versión de producción por la mañana. Al darse cuenta de que había una actualización en macOS, la lanzó y se fue a dormir.


A la mañana siguiente, me sorprendió ver que el ensamblaje se cae de un error desconocido al momento de firmar la aplicación: "ID de desarrollador no notado".


No pospongas hasta mañana lo que se puede hacer hoy. Benjamin Franklin

La esencia del problema


A partir de macOS 10.14.5, Apple ha introducido un procedimiento de notarización obligatorio. El primer artículo de Apple sobre esto fue en 2018, pero fue con esta actualización que este procedimiento se hizo obligatorio. ¿Cómo se ve ella?


Recopila la aplicación -> la envía al servidor de Apple -> Apple la certifica -> Devuelve el estado de la certificación exitosa -> Se ejecuta el comando para establecer el sello de certificación.


Para desarrolladores en Xcode, solo necesita marcar la notarización



Además, el proceso de notarización de la aplicación ensamblada puede realizarse mediante un comando en la terminal.


$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip 

  • primary-bundle-id: ID de paquete de la aplicación
  • nombre de usuario - inicio de sesión de usuario developer.apple.com
  • contraseña: "contraseña específica de la aplicación". Se puede crear en su cuenta personal appleid.apple.com bajo la cuenta del desarrollador.

Si no realiza el procedimiento de notarización, cuando el usuario intenta instalar la aplicación, se bloquea una ventana con un error. Gatekeeper es responsable de verificar la seguridad de la aplicación. Fue él quien rompió el ensamblaje de la aplicación en el generador de electrones.



Cómo se veía el proceso de construcción del generador de electrones


Después de compilar la aplicación en el archivo .app, utilizando la utilidad electron-osx-sign, se firmó la aplicación. Después de firmar con el certificado, se inició el proceso de verificar la aplicación con un gatekepper. Pero con el lanzamiento de la actualización, gatekeeper comenzó a verificar la correcta certificación de la solicitud, y esto no permitió completar con éxito el procedimiento de firma de la solicitud.



Parche para notarización


El usuario de Github, Kallin , sugirió rápidamente una solución, con la adición de dos nuevos parámetros a la configuración. El primero es "gatekeeperAssess": deshabilita la validación del ensamblado después de la firma, y ​​el segundo es "sign", que deshabilita la firma del archivo de instalación (dmg) con un certificado. Esta confirmación se incluye en el lanzamiento de electron-builder 20.43.0.


Para el proceso de notarización en sí, electron-userland tiene un módulo electron-notarize que realiza esta tarea, solo necesita escribir un pequeño script y ejecutarlo usando el gancho afterSign.


Proceso de firma de solicitud y notarización



Inicialmente, debe verificar que haya instalado la versión del generador de electrones> = 20.43.0 e instalar el paquete electron-notarize.


Agregue 2 entradas a las variables de entorno:


  • appleId - login.apple.com desarrollador
  • appleASP: "contraseña específica de la aplicación", que se puede crear en su cuenta personal appleid.apple.com .


Ahora cree un script de notarización que se ejecutará después de firmar la solicitud.


 const notarize = require('electron-notarize').notarize; module.exports = async (context) => { const { electronPlatformName } = context; if (electronPlatformName === 'darwin') { try { console.log('Try notarize app'); await notarize({ appBundleId: 'APP_BUNDLE_ID', appPath: './dist/mac/APP_NAME.app', appleId: process.env.appleId, appleIdPassword: process.env.appleASP, }); console.log('Success notarize'); } catch (err) { console.log(err); } } }; 

Lo guardamos en un lugar conveniente para usted.


Además, para la certificación notarial adecuada, debemos determinar los derechos de acceso
a los recursos del sistema para nuestra aplicación. Para hacer esto, cree el archivo build / rightlements.mac.inherit.plist


 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.allow-dyld-environment-variables</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> <key>com.apple.security.automation.apple-events</key> <true/> </dict> </plist> 

El contenido del archivo en mi caso. Puede haber una configuración diferente para usted. Descripción de todos los campos .
Obligatorio para Electron.js es: com.apple.security.cs.allow-unsigned-ejecutable-memory.


Ahora actualice la configuración en package.json


En la sección para macOS:



  • gatekeeperAssess (deshabilita la validación de la aplicación en el lado electron-osx-sign)
  • hardenedRuntime (le permite crear una lista de permisos de seguridad y acceso a los recursos del sistema)
  • derechos (ruta al archivo de permisos de acceso para nuestra aplicación)

En la sección general de la configuración del generador de electrones:



  • afterSign (ruta al script de notarización, que se iniciará después de firmar la aplicación)

Iniciamos el proceso de montaje. Puede parecer que está un poco suspendido, pero transferir el archivo al servidor de Apple y esperar una respuesta lleva algo de tiempo (de 3 a 10 minutos)


El estado de las notificaciones se puede ver en el terminal ejecutando el comando:


$ xcrun altool --notarization-history 0 -u $appleId -p $appleASP


La respuesta se presentará en una tabla. El campo de estado puede tener el valor 'proceso', 'aprobado', 'inválido'



Si el estado es "inválido", puede ver por el número de solicitud qué salió mal exactamente.


$ xcrun altool --notarization-info "RequestUUID" -u $appleId


Ese es todo el proceso de firma y notarización. Espero que encuentres útil este artículo. Gracias


Pequeña adición


Al transferir la aplicación para la prueba, se descubrió una falla interesante. La solicitud recibida a través de Telegram simplemente se negó a comenzar. Al ver los registros, se descubrió que Telegram puso en cuarentena la aplicación. Por qué razón y cómo sucedió esto, no pude encontrar la respuesta. Al enviar un archivo a través de Yandex.Disk (o cualquier otra forma de descargar a través de un navegador), este problema no ocurre.



Enlaces utiles


Source: https://habr.com/ru/post/455874/


All Articles