아카이브 : 불행히도 더 이상이 프로젝트를 적극적으로 사용하지 않고 2022 년 초부터 제대로 유지하지 못했습니다. 나는 누군가가 포크 하고이 프로젝트를 인수하도록 환영합니다.
Gon은 MACOS의 CLI Binaries 서명 및 공증을위한 간단하고 프릴 도구입니다. Gon은 수동으로 또는 자동화 파이프 라인으로 실행할 수있는 CLI로 제공됩니다. GO에 작성된 프로젝트에 포함 된 GO 라이브러리로도 제공됩니다. Gon은 어떤 언어로든 쓰여진 바이너리에 서명하고 공증 할 수 있습니다.
MacOS Catalina (10.15)부터 Apple은 Mac App Store 외부에 배포 된 모든 소프트웨어를 서명하고 공증해야합니다. 제대로 서명하거나 공증되지 않은 소프트웨어는 "BIN으로 이동"하는 유일한 실행 가능한 옵션이있는 오류 메시지가 표시됩니다. 소프트웨어는 명령 줄에서도 실행할 수 없습니다. 해결 방법은 사용자에게 고통 스럽습니다. Gon은 공증 과정을 자동화하는 데 도움이됩니다.
우리가 지원하고 싶지만 아직 그렇지 않은 기능은 로드맵을 참조하십시오.
아래의 예는 Zip과 DMG를 생성하기 위해 gon 자체에 대해 실행됩니다.

gon 설치하는 가장 쉬운 방법은 Homebrew를 통한 것입니다.
$ brew install mitchellh/gon/gon
릴리스 페이지에서 플랫폼에 대한 적절한 릴리스를 다운로드 할 수도 있습니다. 이것들은 모두 MacOS 10.15+의 상자에서 떨어지도록 서명하고 공증되었습니다.
GO 1.13 이상 go build 사용하여 소스에서 컴파일 할 수도 있습니다. GO 모듈이 활성화되어 있는지 확인하십시오.
gon 파일 경로로 지정하거나 Stdin을 통해 전달할 수있는 구성 파일이 필요합니다. 구성은 gon 파일에 서명하고 패키는 데 사용하는 모든 설정을 지정합니다.
Xcode가 11.0 이상인 MacOS 시스템에서 GON을 실행해야합니다. 코드 서명, 공증 및 포장에는 모두 MacOS 머신에서만 사용할 수있는 도구가 필요합니다.
$ gon [flags] [CONFIG]
실행되면 gon 구성된 파일을 요청한 형식으로 서명, 패키지 및 공증합니다. gon 성공에 대한 0 종료 코드와 실패에 대한 다른 가치로 종료됩니다.
gon 사용하기 전에 개발자 ID 인증서를 확보해야합니다. 이렇게하려면 웹을 통해 또는 Xcode를 통해 Mac에서 로컬로 수행 할 수 있습니다. 이미 설치 한 경우 Xcode를 사용하는 것이 더 쉽습니다.
웹을 통해 :
유효한 Apple ID 자격 증명으로 Developer.apple.com에 로그인하십시오. Apple 개발자 계정에 가입해야 할 수도 있습니다.
인증서 페이지로 이동하십시오.
"+"아이콘을 클릭하고 "개발자 ID 응용 프로그램"을 선택하고 단계를 따르십시오.
인증서를 다운로드 한 후 인증서를 두 번 클릭하여 키 체인으로 가져 오십시오. CI 머신을 구축하는 경우 모든 CI 머신에는 키 체인 에이 인증서가 있어야합니다.
Xcode를 통해 :
Xcode를 열고 xcode로 이동 => preferences => 계정으로 이동합니다.
왼쪽 하단의 "+"를 클릭하고 아직 없으면 Apple ID를 추가하십시오.
Apple 계정을 선택하고 오른쪽 하단에서 "인증서 관리"를 클릭하십시오.
왼쪽 하단의 "+"를 클릭하고 "Developer ID 응용 프로그램"을 클릭하십시오.
목록에서 새로 생성 된 인증서를 마우스 오른쪽 버튼으로 클릭하고 "내보내기"를 클릭하고 파일을 P12 형식의 인증서로 내보내십시오. 이것을 어딘가에 저장하십시오 . 다시는 다운로드 할 수 없습니다.
이를 올바르게 수행했는지 확인하려면 키 체인을 검사 할 수 있습니다.
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities found하나 이상의 인증서가 표시되며 최소한 하나는 개발자 ID 신청서 인증서 여야합니다. 16 진수 문자열 접두사는 구성 파일에서 사용할 수있는 값입니다.
구성 파일은 보고서에 대한 라이센스 목록을 허용/거부 목록, 특정 종속성에 대한 라이센스 상환 등을 지정할 수 있습니다. 구성 파일 형식은 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 내에서 여러 팀을 사용할 때 제공합니다. 이것이 설정되지 않으면 AC_PROVIDER 환경 변수를 기본값으로 읽으려고합니다.
sign - 서명 파일과 관련된 설정.
application_identity ( string ) - 신청서에 서명하는 데 사용할 "Developer ID 응용 프로그램"인증서의 이름 또는 ID. 이는 MacOS의 codesign Binary에 대한 -s 플래그에 대한 유효한 값을 허용합니다. 허용 된 값에 대한 자세한 문서는 man codesign 참조하십시오.
entitlements_file ( string Optional ) -plist 형식으로가는 전체 경로 .EntitLements 파일, codesign 에 대한 --entitlements 인수에 사용됩니다.
dmg ( 선택 사항 ) - 출력으로 디스크 이미지 (DMG) 생성과 관련된 설정. 이것은 지정된 경우에만 생성됩니다. DMG에는 공증 티켓이 오프라인 상태로 확인 될 수 있고 인터넷을 사용 하지 않도록합니다 .
output_path ( string ) - 지퍼 아카이브를 만드는 경로. 이 경로가 이미 존재하면 덮어 씁니다. source 의 모든 파일은 Zip 아카이브의 루트에 복사됩니다.
volume_name ( string ) - Finder, Mounted File Path 등에 표시되는 장착 된 DMG의 이름.
zip ( 선택 사항 ) - Zip Archive를 출력으로 작성하는 것과 관련된 설정. zip 아카이브는 이것이 지정된 경우에만 생성됩니다. Zip Archives는 스테이플링을 지원하지 않습니다. 즉, 공증 된 Zip 아카이브 내의 파일은 처음 사용하면 인터넷 연결이 필요합니다.
output_path ( string ) - 지퍼 아카이브를 만드는 경로. 이 경로가 이미 존재하면 덮어 씁니다. source 의 모든 파일은 Zip 아카이브의 루트에 복사됩니다.공증 전용 모드 :
notarize ( 선택 사항 ) - 이미 내장 된 파일을 공증하기위한 설정. 이것은 source 옵션을 사용하는 대안입니다. 이 옵션을 반복하여 여러 파일을 공증 할 수 있습니다.
path ( string ) - 파일의 경로는 공증됩니다. 이것은 공증을위한 Apple의 지원되는 파일 유형 중 하나 여야합니다 : DMG, PKG, App 또는 Zip.
bundle_id ( string ) -이 공증에 사용할 번들 ID. 이것은 최상위 bundle_id (소스 기반 실행 값을 제어) 대신 사용됩니다.
staple ( bool 옵션 ) - 공증이 성공하면 stapler staple 실행되는 경우 제어합니다. 이를 지원하는 Filetypes (DMG, PKG 또는 App)에 대해서만 설정해야합니다.
이미 서명 한 파일을 공증하도록 gon 구성 할 수 있습니다. PKG, 앱 등의 생성을 이미 지원할 수있는 기존 빌드 파이프 라인에 gon 통합하는 경우 유용합니다.
공증은 패키지의 페이로드도 서명해야하기 때문에이 모드는 패키지 자체뿐만 아니라 페이로드를 코드 디자인했다고 가정합니다. 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 분) 빠르게 진행되는 것을 발견했지만 경우에 따라 공증 요청이 1 시간 이상 대기되었습니다.
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 gon Subprocessing이 아닌 Apple 소프트웨어에서 비롯된 것입니다.
현재 승인을 스크립팅하는 방법을 모르기 때문에 빌드 머신에 대한 권장 사항은 수동으로 한 번 gon 실행하는 것입니다. 누군가가 이것을 자동화 할 수있는 방법을 찾으면 문제를 열어주세요. 알려 주시면이 readme를 업데이트하겠습니다.
Goreleaser는 GO 기반 프로젝트를위한 인기있는 전체 릴리스 자동화 도구입니다. GORELEaser와 함께 Goreleaser 파이프 라인의 일부로 바이너리를 공증하기위한 서명 단계를 보강하기 위해 GON을 사용할 수 있습니다.
다음은 바이너리에 서명하기위한 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 비밀번호 대신 사용해야합니다.
이것들은 내가보고 싶지만 현재 구현되지 않은 것들입니다.