存档:不幸的是,自2022年初以来,我不再积极使用该项目,也没有正确维护它。我欢迎任何人叉子接管这个项目。
GON是一种简单的,无用的工具,用于签署和公证为MacOS的CLI二进制文件。 GON可作为CLI提供,可以手动或自动化管道运行。它也可以作为GO库可用,以嵌入GO编写的项目中。 gon可以用任何语言签名和公证。
从Macos Catalina(10.15)开始,Apple要求在Mac App Store之外分发的所有软件都必须签名和公证。未正确签名或公证的软件将显示出一条错误消息,唯一可行的选项是“移至bin”。该软件即使从命令行也无法运行。解决方法对用户很痛苦。 GON可以帮助您自动化公证的过程。
有关我们要支持但尚未支持的功能,请参见路线图。
下面的示例将gon对立于自身,以生成zip和dmg。

安装gon的最简单方法是通过Homebrew:
$ brew install mitchellh/gon/gon
您也可以从“发行版”页面下载适合您的平台的版本。这些都是在MacOS 10.15+上签名的,并公证了,可以用完。
您还可以使用标准go build使用GO 1.13或更高版本从源中编译。请确保启用GO模块。
gon需要一个可以指定为文件路径或通过STDIN传递的配置文件。配置指定gon将用于签名和包装文件的所有设置。
GON必须在XCode 11.0或更高版本的MacOS计算机上运行。代码签名,公证和包装都需要仅在MacOS计算机上可用的工具。
$ gon [flags] [CONFIG]
执行后, gon将签名,包装和公证化的文件为请求的格式。 gon将在成功的0退出代码和失败方面的任何其他价值中退出。
在使用gon之前,您必须获得开发人员ID证书。为此,您可以通过Web或Mac上本地通过XCode进行操作。如果您已经安装了XCode,则更容易。
通过网络:
登录具有有效的Apple ID凭据的开发人员.apple.com。您可能需要注册Apple开发人员帐户。
导航到证书页面。
单击“+”图标,选择“开发人员ID应用程序”,然后按照这些步骤操作。
下载证书后,双击将其导入到钥匙扣中。如果您是在CI机器上构建的,则每台CI机器都必须在其钥匙扣中具有此证书。
通过Xcode:
打开Xcode,然后转到Xcode => preverences =>帐户
单击左下方的“+”,如果还没有,请添加Apple ID。
选择您的Apple帐户,然后在右下角单击“管理证书”。
单击左下角的“+”,然后单击“开发人员ID应用程序”。
右键单击列表中的新创建的证书,单击“导出”,然后将文件导出为P12-Formatted证书。保存在某个地方。您将永远无法再下载它。
要验证您正确执行此操作,您可以检查钥匙扣:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities found您应该看到一个或多个证书,至少应该是您的开发人员ID应用程序证书。十六进制字符串前缀是您可以在配置文件中使用的值来指定身份。
配置文件可以指定报告允许/拒绝报告的许可列表,特定依赖项的许可替代等等。配置文件格式为HCL或JSON。
例子:
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 "
}
}支持的配置:
source ( array<string> ) - 要签名,软件包和公证的文件列表。如果要签署具有不同身份或不同软件包的多个文件,则应使用单独的配置调用gon 。如果您使用notarize块使用公证模式,这是可选的。
bundle_id ( string ) - 应用程序的捆绑ID。您应该为应用程序选择独特的东西。您也可以向Apple注册。如果您使用notarize块使用公证模式,这是可选的。
apple_id与用于公证的Apple ID相关的设置。
username ( string ) - Apple ID用户名,通常是电子邮件地址。如果未设置,这将默认为AC_USERNAME环境变量。
password ( string ) - 关联的Apple ID的密码。这可以直接指定,也可以使用@keychain:<name>或@env:<name>避免将纯文本密码直接放在配置文件中。 @keychain:<name>语法将带有给定名称的MacOS键链加载密码。 @env:<name>语法将从命名的环境变量加载密码。如果未设置此值,我们将尝试将AC_PASSWORD环境变量用作默认值。
注意:如果启用了2FA,则必须是应用程序密码,而不是您的普通Apple ID密码。有关详细信息,请参见故障排除。
provider ( string ) - 在App Store Connect中使用多个团队时,App Store Connect Provider。如果未设置此设置,我们将尝试将AC_PROVIDER环境变量读取为默认值。
sign - 与签名文件有关的设置。
application_identity ( string ) - 用于签署应用程序的“开发人员ID应用程序”证书的名称或ID。这接受MACOS上codesign二进制的-s标志的任何有效值。有关公认值的详细文档,请参见man codesign 。
entitlements_file ( string可选) - plist格式的完整路径.entiTlements文件,用于--entitlements参数to codesign
dmg (可选) - 与创建磁盘映像(DMG)作为输出有关的设置。仅当指定此功能时才会创建。 DMG还将拥有公证票,以便可以离线验证它,并且不需要互联网使用。
output_path ( string ) - 创建ZIP存档的路径。如果这条路已经存在,它将被覆盖。 source中的所有文件都将复制到zip存档的根部中。
volume_name ( string ) - 在Finder,已安装的文件路径等中显示的已安装DMG的名称等。
zip (可选) - 与创建zip档案作为输出相关的设置。仅在指定这一点时才会创建ZIP档案。请注意,Zip Archives不支持订书机,这意味着公证式邮政编码中的文件将需要Internet连接才能在首次使用时进行验证。
output_path ( string ) - 创建ZIP存档的路径。如果这条路已经存在,它将被覆盖。 source中的所有文件都将复制到zip存档的根部中。仅公证模式:
notarize (可选) - 已建立文件的公证化设置。这是使用source选项的替代方法。可以重复此选项以公证多个文件。
path ( string ) - 文件通道的路径。这必须是Apple支持的公证的文件类型之一:DMG,PKG,APP或ZIP。
bundle_id ( string ) - 用于此公证的捆绑ID。这是使用的,而不是顶级bundle_id (它控制基于源的运行值)。
staple ( bool可选) - 控制stapler staple是否应该在公证人成功的情况下运行。仅对于支持它的FILETYPE(DMG,PKG或APP)才能设置这一点。
您可以配置gon以公证为已签名的文件。如果您将gon集成到现有的构建管道中,该管道可能已经支持PKG,App等文件。
因为公证需要还需要签署包裹有效载荷,所以此模式假设您已经编码有效负载以及软件包本身。 gon不会在notarize块中签名您的包裹。当设置source时,请不要将其与之混淆,而gon本身会创建您的软件包,在这种情况下,它也将签署它们。
除了指定source外,您还可以使用它。在这种情况下,我们将编码和包装source中指定的文件,然后公证这些结果以及notarize块中的文件。
HCl中的示例,然后在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 "
}
}请注意,您可以指定多个notarize块,以同时公证多元文件。
公证过程需要将您的软件包提交给Apple并等待它们扫描它们。据我所知,苹果没有提供公共SLA。
在开发gon并处理公证过程时,我发现该过程平均很快(<10分钟),但在某些情况下,公证请求已排队一个小时或更长时间。
gon将在此过程中输出状态更新,并将无限期地等待公证化完成。如果gon中断,您可以使用gon提交后的GON输出的请求UUID自己检查请求的状态。
gon旨在支持在自动化环境(例如CI管道)中运行的。在此环境中,您应该使用带有gon和-log-json标志的JSON配置文件来获取结构化的记录输出。
gon总是在Stdout(包括错误)和STDERR上的所有日志输出上输出人类可读的输出。通过指定-log-json日志条目将使用JSON结构。您可以使用jq或任何脚本语言等工具来处理JSON的流,以提取重要信息,例如请求UUID,状态等。
当gon在没有TTY的环境中运行时,人类输出将不会被涂色。这使其对于输出日志更友好。
例子:
$ gon -log-level=info -log-json ./config.hcl
...
注意,您必须同时指定-log-level和-log-json 。 -log-level标志一般可以记录。在自动化环境中, info级别足以获取您想要的所有信息。
在第一轮比赛中,可能会多次提示密码。如果单击“始终允许”,则不会再次提示您。这些提示源自gon为子处理的Apple软件,而不是来自gon本身。
我目前不知道如何脚本批准,因此构建机器的建议是手动gon一次。如果有人找到一种自动化的方法,请打开一个问题,让我知道,我将更新此读书文件。
Goreleaser是一种流行的全功能发行自动化工具,用于基于GO的项目。 GON可以与Goreleaser一起使用,以扩大签名步骤,以公证您的二进制文件作为Goreleaser管道的一部分。
这是goreleaser配置示例以签署您的二进制文件:
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 : all要了解更多信息,请参阅Goreleaser文档。
我们还使用GO编程语言公开了一个支持的API,用于签名,包装和大公证文件。请参阅链接的GO文档以获取更多详细信息。
暴露的库是故意的较低级别,并将标志,包装,公证和固定步骤分开。这使您可以轻松地将此功能集成到任何工具中,而不是具有自以为是的gon -CLI体验。
您可能启用了Apple 2FA。您需要生成一个应用程序密码并使用它而不是Apple ID密码。
这些是我想看到的东西,但目前尚未实施。