存檔:不幸的是,自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密碼。
這些是我想看到的東西,但目前尚未實施。