Arquivado: Infelizmente, não uso mais o uso ativo deste projeto e não o mantenho adequadamente desde o início de 2022. Congratulo -me com qualquer um do garfo e assumi esse projeto.
O GON é uma ferramenta simples e sem frescuras para assinar e notificar seus binários da CLI para macOS. O GON está disponível como uma CLI que pode ser executada manualmente ou em pipelines de automação. Também está disponível como uma biblioteca GO para incorporar projetos escritos em Go. Gon pode assinar e notarizar binários escritos em qualquer idioma.
Começando com o MacOS Catalina (10.15), a Apple está exigindo que todo o software distribuído fora da Mac App Store seja assinado e reconhecido. Software que não é devidamente assinado ou reconhecido será mostrado uma mensagem de erro com a única opção acionável sendo "mover para o bin". O software não pode ser executado mesmo a partir da linha de comando. As soluções alternativas são dolorosas para os usuários. Gon ajuda a automatizar o processo de notarização.
Veja o roteiro para obter recursos que queremos apoiar, mas ainda não.
O exemplo abaixo é executado para gon contra si mesmo para gerar um ZIP e DMG.

A maneira mais fácil de instalar gon é via homebrew:
$ brew install mitchellh/gon/gon
Você também pode baixar o lançamento apropriado para sua plataforma na página de lançamentos. Tudo isso é assinado e com nota para sair da caixa no MacOS 10.15+.
Você também pode compilar a partir da fonte usando o Go 1.13 ou posterior usando go build . Certifique -se de que os módulos GO estejam ativados.
gon requer um arquivo de configuração que possa ser especificado como um caminho de arquivo ou passado via Stdin. A configuração especifica todas as configurações gon usará para assinar e embalar seus arquivos.
O GON deve ser executado em uma máquina MacOS com Xcode 11.0 ou posterior. A assinatura de código, o notarização e a embalagem requerem ferramentas disponíveis apenas nas máquinas macos.
$ gon [flags] [CONFIG]
Quando executado, gon assinará, pacote e notariza arquivos configurados nos formatos solicitados. gon sairá com um código de saída 0 sobre o sucesso e qualquer outro valor na falha.
Antes de usar gon , você deve adquirir um certificado de identificação do desenvolvedor. Para fazer isso, você pode fazê -lo através da Web ou via Xcode localmente em um Mac. O uso do Xcode é mais fácil se você já o tiver instalado.
Através da web:
Entre no desenvolvedor.apple.com com credenciais válidas da Apple ID. Pode ser necessário se inscrever em uma conta de desenvolvedor da Apple.
Navegue até a página Certificados.
Clique no ícone "+", selecione "Aplicativo de ID do desenvolvedor" e siga as etapas.
Depois de baixar o certificado, clique duas vezes para importá-lo para o seu chaveiro. Se você estiver construindo em uma máquina de CI, toda máquina de CI deve ter esse certificado em seu chaveiro.
Via xcode:
Abra o Xcode e vá para Xcode => Preferências => Contas
Clique no "+" na parte inferior esquerda e adicione seu ID da Apple, se ainda não o fez.
Selecione sua conta da Apple e clique em "Gerenciar certificados" no canto inferior direito.
Clique em "+" no canto inferior esquerdo e clique em "Aplicativo de ID do desenvolvedor".
Clique com o botão direito do mouse no certificado recém-criado na lista, clique em "Exportar" e exportar o arquivo como um certificado formatado em P12. Salve isso em algum lugar . Você nunca poderá fazer o download novamente.
Para verificar se você fez isso corretamente, você pode inspecionar seu chaveiro:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities foundVocê deve ver um ou mais certificados e pelo menos um deve ser o seu certificado de aplicativo de ID do desenvolvedor. O prefixo de string hexadecimal é o valor que você pode usar no seu arquivo de configuração para especificar a identidade.
O arquivo de configuração pode especificar listas de licenças de permitir/negar para relatórios, substituições de licença para dependências específicas e muito mais. O formato do arquivo de configuração é HCL ou JSON.
Exemplo:
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 "
}
}Configurações suportadas:
source ( array<string> ) - Uma lista de arquivos para assinar, embalagem e notarize. Se você deseja assinar vários arquivos com identidades diferentes ou em pacotes diferentes, invocará gon com configurações separadas. Isso é opcional se você estiver usando o modo somente notarização com o bloco notarize .
bundle_id ( string ) - O ID do pacote para o seu aplicativo. Você deve escolher algo único para o seu aplicativo. Você também pode registrá -los na Apple. Isso é opcional se você estiver usando o modo somente notarização com o bloco notarize .
apple_id - Configurações relacionadas ao ID da Apple para usar para notarização.
username ( string ) - O nome de usuário do Apple ID, normalmente um endereço de e -mail. Isso será padrão para a variável de ambiente AC_USERNAME , se não for definido.
password ( string ) - A senha para o ID da Apple associado. Isso pode ser especificado diretamente ou usando @keychain:<name> ou @env:<name> para evitar colocar a senha de texto simples diretamente em um arquivo de configuração. A sintaxe @keychain:<name> carregará a senha do chaveiro do MacOS com o nome fornecido. A sintaxe @env:<name> carregará a senha da variável ambiental nomeada. Se esse valor não estiver definido, tentaremos usar a variável de ambiente AC_PASSWORD como padrão.
NOTA : Se você tiver 2FA ativado, a senha deve ser uma senha de aplicativo, não a senha normal da Apple ID. Consulte Solução de problemas para obter detalhes.
provider ( string ) - O provedor de conexão da App Store ao usar várias equipes no App Store Connect. Se isso não estiver definido, tentaremos ler a variável de ambiente AC_PROVIDER como padrão.
sign - Configurações relacionadas à assinatura de arquivos.
application_identity ( string ) - O nome ou ID do certificado "Aplicativo de ID do desenvolvedor" a ser usado para assinar aplicativos. Isso aceita qualquer valor válido para o sinalizador -s para o binário codesign no macOS. Consulte man codesign para obter uma documentação detalhada sobre os valores aceitos.
entitlements_file ( string Opcional ) -O caminho completo para um arquivo de formato .Entitlements, usado para o argumento --entitlements para codesign
dmg ( Opcional ) - Configurações relacionadas à criação de uma imagem de disco (DMG) como saída. Isso só será criado se isso for especificado. O DMG também terá o tíquete de notarização grampeado para que possa ser verificado offline e não exija a Internet para usar.
output_path ( string ) - O caminho para criar o arquivo zip. Se esse caminho já existir, será substituído. Todos os arquivos na source serão copiados na raiz do arquivo zip.
volume_name ( string ) - o nome do DMG montado que aparece no Finder, o caminho do arquivo montado, etc.
zip ( opcional ) - Configurações relacionadas à criação de um arquivo zip como saída. Um arquivo zip será criado apenas se isso for especificado. Observe que os arquivos do ZIP não suportam grampeamento, o que significa que os arquivos dentro do Arquivo Zip Notarizado exigirão uma conexão com a Internet para verificar no primeiro uso.
output_path ( string ) - O caminho para criar o arquivo zip. Se esse caminho já existir, será substituído. Todos os arquivos na source serão copiados na raiz do arquivo zip.Modo somente de notarização:
notarize ( Opcional ) - Configurações para autenticação de arquivos já construídos. Esta é uma alternativa para usar a opção source . Esta opção pode ser repetida para nota vários arquivos.
path ( string ) - O caminho para o arquivo para notarizar. Esse deve ser um dos tipos de arquivos suportados da Apple para reconhecimento: DMG, PKG, APP ou ZIP.
bundle_id ( string ) - O ID do pacote a ser usado para esta notarização. Isso é usado em vez do bundle_id de nível superior (que controla o valor para execuções baseadas em fonte).
staple ( bool Opcional ) - Controla se stapler staple deve ser executado se o notarização for bem -sucedido. Isso deve ser definido apenas para arquivos que o suportam (DMG, PKG ou APP).
Você pode configurar gon para nota os arquivos já assinados. Isso é útil se você estiver integrando gon em um pipeline de construção existente que já pode suportar a criação de arquivos PKG, APP, etc.
Como a notarização exige que a carga útil dos pacotes também seja assinada, esse modo pressupõe que você tenha designado a carga útil e o próprio pacote. gon não assinará seu pacote nos blocos notarize . Por favor, não confunda isso quando source é definida e o próprio gon cria seus pacotes; nesse caso, ele também os assinará.
Você também pode usar isso, além de especificar source . Nesse caso, codificaremos e empacotaremos os arquivos especificados na source e, em seguida, reconheceremos esses resultados, bem como os em blocos notarize .
Exemplo no HCL e depois na configuração idêntica em 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 "
}
} NOTA Você pode especificar vários blocos notarize para notarizar arquivos multipull simultaneamente.
O processo de notarização requer enviar seus pacotes para a Apple e aguardá -los para digitalizar. A Apple não fornece SLA pública, tanto quanto eu sei.
Ao desenvolver gon e trabalhar com o processo de reconhecimento, achei o processo rápido em média (<10 minutos), mas, em alguns casos, os pedidos de notarização foram filmados por uma hora ou mais.
gon produzirá atualizações de status do que for e aguardará indefinidamente a conclusão do Notarização. Se gon for interrompido, você poderá verificar o status de uma solicitação usando a solicitação UUID que gon sai após o envio.
gon é criado para suportar a execução em ambientes automatizados, como os pipelines de CI. Nesse ambiente, você deve usar os arquivos de configuração do JSON com gon e o sinalizador -log-json para obter saída de log estruturada.
gon sempre produz a saída legível pelo homem no STDOUT (incluindo erros) e toda a saída de log no STDERR. Ao especificar -log-json as entradas de log serão estruturadas com JSON. Você pode processar o fluxo de JSON usando uma ferramenta como jq ou qualquer linguagem de script para extrair informações críticas, como a solicitação UUID, Status e muito mais.
Quando gon é executado em um ambiente sem TTY, a produção humana não será colorida. Isso o torna mais amigável para logs de saída.
Exemplo:
$ gon -log-level=info -log-json ./config.hcl
...
Observe que você deve especificar -se -log-level e -log-json . O sinalizador -log-level permite o registro em geral. Um nível de info é suficiente em ambientes de automação para obter todas as informações que você deseja.
Na primeira corrida, pode ser solicitado várias vezes para senhas. Se você clicar em "Sempre permitir", não será solicitado novamente. Esses avisos são originários do software da Apple que gon está subprocessando, e não do próprio gon .
No momento, não sei como script as aprovações; portanto, a recomendação das máquinas de construção é executar gon manualmente uma vez. Se alguém encontrar uma maneira de automatizar isso, abra um problema, me avise e eu atualizarei este ReadMe.
O GORELEASER é uma ferramenta popular de automação de lançamento completa completa para projetos baseados em Go. O GON pode ser usado com o GORELEASER para aumentar a etapa de assinatura para reconhecer seus binários como parte de um oleoduto Goreleaser.
Aqui está um exemplo de configuração do GoreLeaser para assinar seus binários:
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 saber mais, consulte a documentação do GoreLeaser.
Também expojamos uma API suportada para assinar, embalagens e grauções de nota usando a linguagem de programação GO. Consulte a documentação do Linked Go para obter mais detalhes.
As bibliotecas expostas são propositadamente mais baixas e separam o sinal, o pacote, o notarização e as etapas grampeando. Isso permite integrar essa funcionalidade a qualquer ferramenta de facilidade versus ter uma experiência opinativa gon -Cli.
Você provavelmente tem Apple 2FA ativado. Você precisará gerar uma senha de aplicativo e usá -lo em vez da senha do Apple ID.
Essas são algumas coisas que eu adoraria ver, mas atualmente não são implementadas.