Archivado: Desafortunadamente, ya no hago un uso activo de este proyecto y no lo he mantenido adecuadamente desde principios de 2022. Doy la bienvenida a cualquiera que bifurque y se haga cargo de este proyecto.
Gon es una herramienta simple y sin lujos para firmar y notar por notar a sus binarios de CLI para macOS. Gon está disponible como una CLI que se puede ejecutar manualmente o en tuberías de automatización. También está disponible como biblioteca GO para integrar en proyectos escritos en GO. Gon puede firmar y notarizar binarios escritos en cualquier idioma.
Comenzando con MacOS Catalina (10.15), Apple requiere que todo el software distribuido fuera de la App Store de Mac sea firmado y notariado. El software que no está firmado o notarizado correctamente se mostrará un mensaje de error con la única opción procesable que "moverse a Bin". El software no se puede ejecutar incluso desde la línea de comandos. Las soluciones son dolorosas para los usuarios. Gon lo ayuda a automatizar el proceso de notarización.
Vea la hoja de ruta para las características que queremos apoyar pero que todavía no.
El siguiente ejemplo ejecuta gon contra sí mismo para generar una zip y DMG.

La forma más fácil de instalar gon es a través de Homebrew:
$ brew install mitchellh/gon/gon
También puede descargar la versión apropiada para su plataforma desde la página de versiones. Todos estos están firmados y notarizados para salir de la caja en MacOS 10.15+.
También puede compilar desde la fuente utilizando Go 1.13 o posterior usando go build . Asegúrese de que los módulos GO estén habilitados.
gon requiere un archivo de configuración que se pueda especificar como una ruta de archivo o pasar a través de stdin. La configuración especifica todas las configuraciones gon usará para firmar y empaquetar sus archivos.
Gon debe ejecutarse en una máquina macOS con Xcode 11.0 o posterior. La firma de código, la notarización y el embalaje requieren herramientas que solo están disponibles en las máquinas MacOS.
$ gon [flags] [CONFIG]
Cuando se ejecuta, gon firmará, empaquetará y nogarizará los archivos configurados en formatos solicitados. gon saldrá con un código de salida 0 en el éxito y cualquier otro valor en la falla.
Antes de usar gon , debe adquirir un certificado de ID de desarrollador. Para hacer esto, puede hacerlo a través de la web o a través de Xcode localmente en una Mac. Usar Xcode es más fácil si ya lo tiene instalado.
A través de la web:
Inicie sesión en desarrollador.apple.com con credenciales de ID de Apple válidas. Es posible que deba registrarse en una cuenta de desarrollador de Apple.
Navegue a la página de certificados.
Haga clic en el icono "+", seleccione "Aplicación de ID de desarrollador" y siga los pasos.
Después de descargar el certificado, haga doble clic para importarlo en su llavero. Si está construyendo en una máquina CI, cada máquina CI debe tener este certificado en su llavero.
Vía Xcode:
Abra xcode y vaya a xcode => preferencias => cuentas
Haga clic en el "+" en la parte inferior izquierda y agregue su ID de Apple si aún no lo ha hecho.
Seleccione su cuenta de Apple y haga clic en "Administrar certificados" en la esquina inferior derecha.
Haga clic en "+" en la esquina inferior izquierda y haga clic en "Aplicación de ID de desarrollador".
Haga clic con el botón derecho en el certificado recién creado en la lista, haga clic en "Exportar" y exporte el archivo como un certificado formatado en P12. Guarde esto en alguna parte . Nunca podrás descargarlo de nuevo.
Para verificar que haya hecho esto correctamente, puede inspeccionar su llavero:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities foundDebería ver uno o más certificados y al menos uno debería ser el certificado de solicitud de ID de desarrollador. El prefijo de cadena hexadecimal es el valor que puede usar en su archivo de configuración para especificar la identidad.
El archivo de configuración puede especificar Permitir/Denegar listas de licencias para informes, anulaciones de licencias para dependencias específicas y más. El formato de archivo de configuración es HCL o JSON.
Ejemplo:
source = [ " ./terraform " ]
bundle_id = " com.mitchellh.example.terraform "
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
provider = " UL304B4VGY "
}
sign {
application_identity = " Developer ID Application: Mitchell Hashimoto "
}
dmg {
output_path = " terraform.dmg "
volume_name = " Terraform "
}
zip {
output_path = " terraform.zip "
}{
"source" : [ " ./terraform " ],
"bundle_id" : " com.mitchellh.example.terraform " ,
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD " ,
"provider" : " UL304B4VGY "
},
"sign" :{
"application_identity" : " Developer ID Application: Mitchell Hashimoto "
},
"dmg" :{
"output_path" : " terraform.dmg " ,
"volume_name" : " Terraform "
},
"zip" :{
"output_path" : " terraform.zip "
}
}Configuraciones compatibles:
source ( array<string> ): una lista de archivos para firmar, empaquetar y notarizar. Si desea firmar varios archivos con diferentes identidades o en diferentes paquetes, debe invocar gon con configuraciones separadas. Esto es opcional si está utilizando el modo de solo notarización con el bloque notarize .
bundle_id ( string ) - El ID de paquete para su aplicación. Debe elegir algo único para su aplicación. También puede registrarlos con Apple. Esto es opcional si está utilizando el modo de solo notarización con el bloque notarize .
apple_id : configuración relacionada con la ID de Apple para usar para la notarización.
username ( string ): el nombre de usuario de ID de Apple, generalmente una dirección de correo electrónico. Esto predeterminará la variable de entorno AC_USERNAME si no está establecida.
password ( string ): la contraseña para la ID de Apple asociada. Esto se puede especificar directamente o usar @keychain:<name> o @env:<name> para evitar colocar la contraseña de texto sin formato directamente en un archivo de configuración. La sintaxis @keychain:<name> cargará la contraseña del llavero MacOS con el nombre de pila. La sintaxis @env:<name> cargará la contraseña de la variable ambiental nombrada. Si este valor no está configurado, intentaremos usar la variable de entorno AC_PASSWORD como un valor predeterminado.
Nota : Si tiene habilitado 2FA, la contraseña debe ser una contraseña de aplicación, no su contraseña normal de ID de Apple. Vea la solución de problemas para más detalles.
provider ( string ): el proveedor de App Store Connect cuando usa varios equipos dentro de App Store Connect. Si esto no está configurado, intentaremos leer la variable de entorno AC_PROVIDER como un valor predeterminado.
sign - Configuración relacionada con la firma de archivos.
application_identity ( string ): el nombre o ID del certificado de "Aplicación de ID de desarrollador" para usar para firmar aplicaciones. Esto acepta cualquier valor válido para el indicador -s para el binario codesign en macOS. Consulte man codesign para una documentación detallada sobre los valores aceptados.
entitlements_file ( string opcional ): la ruta completa a un archivo de formato Plist .Entitlements, utilizado para el argumento --entitlements a codesign
dmg ( opcional ): configuración relacionada con la creación de una imagen de disco (DMG) como salida. Esto solo se creará si esto se especifica. El DMG también tendrá el boleto de notarización grapado para que pueda verificarse fuera de línea y no requerir que se use Internet.
output_path ( string ): la ruta para crear el archivo zip. Si este camino ya existe, se sobrescribirá. Todos los archivos en source se copiarán en la raíz del archivo ZIP.
volume_name ( string ): el nombre del DMG montado que aparece en Finder, la ruta de archivo montada, etc.
zip ( opcional ): configuración relacionada con la creación de un archivo ZIP como salida. Solo se creará un archivo zip si esto se especifica. Tenga en cuenta que los archivos ZIP no admiten el grapado, lo que significa que los archivos dentro del archivo ZIP notarizado requerirán una conexión a Internet para verificar el primer uso.
output_path ( string ): la ruta para crear el archivo zip. Si este camino ya existe, se sobrescribirá. Todos los archivos en source se copiarán en la raíz del archivo ZIP.Modo solo de notarización:
notarize ( opcional ): configuración para notarizar archivos ya construidos. Esta es una alternativa al uso de la opción source . Esta opción se puede repetir para notarizar varios archivos.
path ( string ): la ruta al archivo para notarizar. Este debe ser uno de los tipos de archivos compatibles con Notarización de Apple: DMG, PKG, APP o ZIP.
bundle_id ( string ): la identificación del paquete para usar para esta notarización. Esto se usa en lugar del bundle_id de nivel superior (que controla el valor para las ejecuciones basadas en la fuente).
staple ( bool OPCIONAL ): controla si stapler staple debe ejecutarse si la notarización tiene éxito. Esto solo debe establecerse para filetipos que lo admiten (DMG, PKG o APP).
Puede configurar gon para notarizar archivos ya firmados. Esto es útil si está integrando gon en una tubería de compilación existente que ya puede admitir la creación de archivos PKG, APP, etc.
Debido a que la notarización requiere que la carga de paquetes también se firme, este modo supone que ha realizado la carga útil y el paquete en sí. gon no firmará su paquete en los bloques notarize . No confunda esto con cuando source está configurada y gon crea sus paquetes, en cuyo caso también los firmará.
Puede usar esto además de especificar source también. En este caso, codificaremos y empaquetaremos los archivos especificados en source y luego notarizaremos esos resultados, así como aquellos en bloques notarize .
Ejemplo en HCL y luego la configuración idéntica en JSON:
notarize {
path = " /path/to/terraform.pkg "
bundle_id = " com.mitchellh.example.terraform "
staple = true
}
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
}{
"notarize" : [{
"path" : " /path/to/terraform.pkg " ,
"bundle_id" : " com.mitchellh.example.terraform " ,
"staple" : true
}],
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD "
}
} Tenga en cuenta que puede especificar múltiples bloques notarize para notarizar los archivos multiplicar simultáneamente.
El proceso de notarización requiere enviar su (s) paquete (s) a Apple y esperar que los escaneen. Apple no ofrece SLA público por lo que puedo decir.
Al desarrollar gon y trabajar con el proceso de notarización, he encontrado que el proceso es rápido en promedio (<10 minutos), pero en algunos casos las solicitudes de notarización se han colocado durante una hora o más.
gon emitirá actualizaciones de estado a medida que avanza, y esperará indefinidamente para que la notarización se complete. Si gon se interrumpe, puede verificar el estado de una solicitud usted mismo utilizando la solicitud UUID que gon sale después del envío.
gon está construido para admitir la ejecución dentro de entornos automatizados como CI Pipelines. En este entorno, debe usar archivos de configuración JSON con gon y el indicador -log-json para obtener una salida de registro estructurada.
gon siempre sale de salida legible por humanos en STDOUT (incluidos errores) y toda la salida de registro en Stderr. Al especificar -log-json las entradas de registro se estructurarán con JSON. Puede procesar la secuencia de JSON utilizando una herramienta como jq o cualquier lenguaje de secuencias de comandos para extraer información crítica, como el UUID, el estado y más.
Cuando gon se ejecuta en un entorno sin TTY, la producción humana no se coloreará. Esto lo hace más amigable para los registros de salida.
Ejemplo:
$ gon -log-level=info -log-json ./config.hcl
...
Nota Debe especificar tanto -log-level como -log-json . El indicador -log-level habilita el registro en general. Un nivel info es suficiente en los entornos de automatización para obtener toda la información que desee.
En la primera carrera se puede solicitar varias veces para las contraseñas. Si hace clic en "siempre, lo permita", no se le solicitará nuevamente. Estas indicaciones se originan en el software Apple de que gon está subprocesando, y no de gon .
Actualmente no sé cómo escribir las aprobaciones, por lo que la recomendación en Build Machines es ejecutar gon manualmente una vez. Si alguien encuentra una manera de automatizar esto, abra un problema, hágamelo saber y actualizaré este readme.
Goreleaser es una herramienta popular de automatización de lanzamientos con todos los proyectos basados en GO. Gon se puede usar con Goreleaser para aumentar el paso de firma para notarizar sus binarios como parte de una tubería de Goreleaser.
Aquí hay un ejemplo de configuración de Goreleaser para firmar sus binarios:
builds :
- binary : foo
id : foo
goos :
- linux
- windows
goarch :
- amd64
# notice that we need a separated build for the macos binary only:
- binary : foo
id : foo-macos
goos :
- darwin
goarch :
- amd64
signs :
- signature : " ${artifact}.dmg "
ids :
- foo-macos # here we filter the macos only build id
# you'll need to have gon on PATH
cmd : gon
# you can follow the gon docs to properly create the gon.hcl config file:
# https://github.com/mitchellh/gon
args :
- gon.hcl
artifacts : allPara obtener más información, consulte la documentación de Goreleaser.
También exponemos una API compatible para firmar, empacar y nogarizar archivos utilizando el lenguaje de programación GO. Consulte la documentación de GO vinculada para obtener más detalles.
Las bibliotecas expuestas son deliberadamente de nivel más bajo y separan el signo, el paquete, la notarización y los pasos de grapado. Esto le permite integrar esta funcionalidad en cualquier herramienta fácilmente frente a tener una experiencia de gon -Cli obstinada.
Es probable que tenga habilitado Apple 2FA. Deberá generar una contraseña de aplicación y usarla en lugar de su contraseña de ID de Apple.
Estas son algunas cosas que me encantaría ver pero actualmente no se implementan.