Diarsipkan: Sayangnya saya tidak lagi menggunakan proyek ini secara aktif dan belum mempertahankannya dengan benar sejak awal 2022. Saya menyambut siapa pun untuk membayar dan mengambil alih proyek ini.
Gon adalah alat sederhana, tanpa embel-embel untuk menandatangani dan mencatat binari CLI Anda untuk macOS. Gon tersedia sebagai CLI yang dapat dijalankan secara manual atau di dalam pipa otomatisasi. Ini juga tersedia sebagai perpustakaan GO untuk menanamkan dalam proyek yang ditulis dalam Go. Gon dapat menandatangani dan memberi notaris biner yang ditulis dalam bahasa apa pun.
Dimulai dengan MacOS Catalina (10.15), Apple mengharuskan semua perangkat lunak yang didistribusikan di luar Mac App Store untuk ditandatangani dan dinotasikan. Perangkat lunak yang tidak ditandatangani dengan benar atau notaris akan ditampilkan pesan kesalahan dengan satu -satunya opsi yang dapat ditindaklanjuti adalah untuk "pindah ke bin". Perangkat lunak tidak dapat dijalankan bahkan dari baris perintah. Penanganan solusi bagi pengguna. Gon membantu Anda mengotomatiskan proses notaris.
Lihat peta jalan untuk fitur yang ingin kami dukung tetapi belum.
Contoh di bawah ini menjalankan gon terhadap dirinya sendiri untuk menghasilkan zip dan DMG.

Cara termudah untuk menginstal gon adalah melalui homebrew:
$ brew install mitchellh/gon/gon
Anda juga dapat mengunduh rilis yang sesuai untuk platform Anda dari halaman rilis. Ini semua ditandatangani dan dinotasikan untuk kehabisan kotak di MacOS 10.15+.
Anda juga dapat mengkompilasi dari sumber menggunakan Go 1.13 atau lebih baru menggunakan Standard go build . Pastikan modul GO diaktifkan.
gon memerlukan file konfigurasi yang dapat ditentukan sebagai jalur file atau diteruskan melalui stdin. Konfigurasi menentukan semua pengaturan gon akan digunakan untuk menandatangani dan mengemas file Anda.
Gon harus dijalankan pada mesin macOS dengan xcode 11.0 atau lebih baru. Penandatanganan kode, notaris, dan pengemasan semua membutuhkan alat yang hanya tersedia di mesin macOS.
$ gon [flags] [CONFIG]
Saat dieksekusi, gon akan menandatangani, mengemas, dan notaris file yang dikonfigurasi ke dalam format yang diminta. gon akan keluar dengan kode keluar 0 pada keberhasilan dan nilai lainnya pada kegagalan.
Sebelum menggunakan gon , Anda harus memperoleh sertifikat ID pengembang. Untuk melakukan ini, Anda dapat melakukannya melalui web atau melalui Xcode secara lokal di Mac. Menggunakan Xcode lebih mudah jika Anda sudah menginstalnya.
Melalui web:
Masuk ke pengembang.apple.com dengan kredensial ID Apple yang valid. Anda mungkin perlu mendaftar untuk akun pengembang Apple.
Arahkan ke halaman sertifikat.
Klik ikon "+", pilih "Aplikasi ID Pengembang" dan ikuti langkah -langkahnya.
Setelah mengunduh sertifikat, klik dua kali untuk mengimpornya ke gantungan kunci Anda. Jika Anda membangun di atas mesin CI, setiap mesin CI harus memiliki sertifikat ini di gantungan kunci mereka.
Via xcode:
Buka Xcode dan Pergi ke Xcode => Preferensi => Akun
Klik "+" di kiri bawah dan tambahkan ID Apple Anda jika Anda belum melakukannya.
Pilih akun Apple Anda dan klik "Kelola Sertifikat" di sudut kanan bawah.
Klik "+" di sudut kiri bawah dan klik "Aplikasi ID Pengembang".
Klik kanan sertifikat yang baru dibuat dalam daftar, klik "Ekspor" dan mengekspor file sebagai sertifikat yang diformat P12. Simpan ini di suatu tempat . Anda tidak akan pernah bisa mengunduhnya lagi.
Untuk memverifikasi Anda melakukan ini dengan benar, Anda dapat memeriksa gantungan kunci Anda:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities foundAnda harus melihat satu atau lebih sertifikat dan setidaknya satu harus menjadi sertifikat aplikasi ID pengembang Anda. Awalan string hexadecimal adalah nilai yang dapat Anda gunakan di file konfigurasi Anda untuk menentukan identitas.
File konfigurasi dapat menentukan daftar izin/tolak lisensi untuk laporan, override lisensi untuk dependensi tertentu, dan banyak lagi. Format file konfigurasi adalah HCL atau JSON.
Contoh:
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 "
}
}Konfigurasi yang Didukung:
source ( array<string> ) - Daftar file yang harus ditandatangani, paket, dan notaris. Jika Anda ingin menandatangani beberapa file dengan identitas yang berbeda atau ke dalam paket yang berbeda, maka Anda harus memohon gon dengan konfigurasi terpisah. Ini opsional jika Anda menggunakan mode notarisasi saja dengan blok notarize .
bundle_id ( string ) - ID bundel untuk aplikasi Anda. Anda harus memilih sesuatu yang unik untuk aplikasi Anda. Anda juga dapat mendaftarkan ini dengan Apple. Ini opsional jika Anda menggunakan mode notarisasi saja dengan blok notarize .
apple_id - Pengaturan yang terkait dengan ID Apple untuk digunakan untuk notarisasi.
username ( string ) - Nama pengguna Apple ID, biasanya alamat email. Ini akan default ke variabel lingkungan AC_USERNAME jika tidak diatur.
password ( string ) - Kata sandi untuk ID Apple terkait. Ini dapat ditentukan secara langsung atau menggunakan @keychain:<name> atau @env:<name> untuk menghindari meletakkan kata sandi plaintext secara langsung dalam file konfigurasi. Sintaks @keychain:<name> akan memuat kata sandi dari gantungan kunci macOS dengan nama yang diberikan. Sintaks @env:<name> akan memuat kata sandi dari variabel lingkungan yang disebutkan. Jika nilai ini tidak diatur, kami akan mencoba menggunakan variabel lingkungan AC_PASSWORD sebagai default.
Catatan : Jika Anda memiliki 2FA diaktifkan, kata sandi harus merupakan kata sandi aplikasi, bukan kata sandi ID Apple normal Anda. Lihat Pemecahan Masalah untuk detailnya.
provider ( string ) - App Store Connect Provider saat menggunakan beberapa tim di App Store Connect. Jika ini tidak diatur, kami akan mencoba membaca variabel lingkungan AC_PROVIDER sebagai default.
sign - Pengaturan Terkait dengan Menandatangani File.
application_identity ( string ) - Nama atau ID dari sertifikat "Aplikasi ID Pengembang" yang akan digunakan untuk menandatangani aplikasi. Ini menerima nilai apa pun yang valid untuk bendera -s untuk biner codesign pada macOS. Lihat man codesign untuk dokumentasi terperinci tentang nilai yang diterima.
entitlements_file ( string Opsional --entitlements -Jalur lengkap ke format codesign
dmg ( Opsional ) - Pengaturan yang terkait dengan membuat gambar disk (DMG) sebagai output. Ini hanya akan dibuat jika ini ditentukan. DMG juga akan memiliki tiket notarisasi yang dijepit sehingga dapat diverifikasi secara offline dan tidak memerlukan internet untuk digunakan.
output_path ( string ) - Jalur untuk membuat arsip zip. Jika jalan ini sudah ada, itu akan ditimpa. Semua file dalam source akan disalin ke akar arsip ZIP.
volume_name ( string ) - Nama DMG yang dipasang yang muncul di Finder, jalur file yang dipasang, dll.
zip ( Opsional ) - Pengaturan yang terkait dengan membuat arsip ZIP sebagai output. Arsip ZIP hanya akan dibuat jika ini ditentukan. Perhatikan bahwa arsip ZIP tidak mendukung stapling, yang berarti bahwa file dalam arsip ZIP yang diawali akan memerlukan koneksi internet untuk memverifikasi penggunaan pertama.
output_path ( string ) - Jalur untuk membuat arsip zip. Jika jalan ini sudah ada, itu akan ditimpa. Semua file dalam source akan disalin ke akar arsip ZIP.Mode Notarison-Hanya:
notarize ( Opsional ) - Pengaturan untuk NoTarizing File yang Sudah Dibangun. Ini adalah alternatif untuk menggunakan opsi source . Opsi ini dapat diulang untuk membuat banyak file.
path ( string ) - Path ke file untuk noTarize. Ini harus menjadi salah satu jenis file yang didukung Apple untuk notarisasi: DMG, PKG, App, atau ZIP.
bundle_id ( string ) - ID bundel yang akan digunakan untuk notarisasi ini. Ini digunakan sebagai pengganti bundle_id tingkat atas (yang mengontrol nilai untuk menjalankan berbasis sumber).
staple ( bool Opsional ) - Kontrol Jika stapler staple harus berjalan jika notarisasi berhasil. Ini hanya boleh ditetapkan untuk filetypes yang mendukungnya (DMG, PKG, atau APP).
Anda dapat mengonfigurasi gon untuk membuat file yang sudah ditandatangani. Ini berguna jika Anda mengintegrasikan gon ke dalam pipa build yang ada yang mungkin sudah mendukung pembuatan file PKG, aplikasi, dll.
Karena notarisasi mensyaratkan muatan paket untuk juga ditandatangani, mode ini mengasumsikan bahwa Anda telah menandatangani kode muatan serta paket itu sendiri. gon tidak akan menandatangani paket Anda di blok notarize . Tolong jangan bingung dengan saat source diatur dan gon sendiri membuat paket Anda, dalam hal ini juga akan menandatanganinya.
Anda dapat menggunakan ini sebagai tambahan untuk menentukan source juga. Dalam hal ini, kami akan mem -kode & mengemas file yang ditentukan dalam source dan kemudian mencatat hasil tersebut serta yang ada di blok notarize .
Contoh dalam HCl dan kemudian konfigurasi yang identik di 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 "
}
} CATATAN Anda dapat menentukan beberapa blok notarize untuk notaris file multipel secara bersamaan.
Proses notaris mengharuskan mengirimkan paket Anda ke Apple dan menunggu mereka memindai mereka. Apple tidak memberikan SLA publik sejauh yang saya tahu.
Dalam mengembangkan gon dan bekerja dengan proses notarisasi, saya telah menemukan prosesnya rata -rata cepat (<10 menit) tetapi dalam beberapa kasus permintaan notaris telah diantri selama satu jam atau lebih.
gon akan menghasilkan pembaruan status seperti yang terjadi, dan akan menunggu tanpa batas waktu untuk menyelesaikan notaris. Jika gon terganggu, Anda dapat memeriksa status permintaan sendiri menggunakan uuid permintaan yang output gon setelah pengiriman.
gon dibangun untuk mendukung berjalan di dalam lingkungan otomatis seperti pipa CI. Di lingkungan ini, Anda harus menggunakan file konfigurasi JSON dengan gon dan -log-json flag untuk mendapatkan output logging terstruktur.
gon selalu mengeluarkan output yang dapat dibaca manusia pada stdout (termasuk kesalahan) dan semua output log pada stderr. Dengan menentukan -log-json entri log akan disusun dengan JSON. Anda dapat memproses aliran JSON menggunakan alat seperti jq atau bahasa skrip apa pun untuk mengekstraksi informasi penting seperti permintaan UUID, status, dan banyak lagi.
Ketika gon dijalankan di lingkungan tanpa TTY, output manusia tidak akan diwarnai. Ini membuatnya lebih ramah untuk log keluaran.
Contoh:
$ gon -log-level=info -log-json ./config.hcl
...
Catatan Anda harus menentukan baik -log-level dan -log-json . Bendera -log-level memungkinkan penebangan secara umum. Level info sudah cukup di lingkungan otomatisasi untuk mendapatkan semua informasi yang Anda inginkan.
Pada First-Run dapat diminta beberapa kali untuk kata sandi. Jika Anda mengklik "Selalu Izinkan" maka Anda tidak akan diminta lagi. Prompt ini berasal dari perangkat lunak Apple yang gon subproses, dan bukan dari gon itu sendiri.
Saat ini saya tidak tahu cara membuat skrip persetujuan, jadi rekomendasi pada mesin build adalah menjalankan gon secara manual sekali. Jika ada yang menemukan cara untuk mengotomatiskan ini, buka masalah, beri tahu saya, dan saya akan memperbarui readme ini.
Goreleaser adalah alat otomatisasi rilis fitur lengkap yang populer untuk proyek berbasis GO. Gon dapat digunakan dengan goreleaser untuk menambah langkah penandatanganan untuk mencatat binari Anda sebagai bagian dari pipa goreleaser.
Berikut adalah contoh konfigurasi goreleaser untuk menandatangani binari Anda:
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 : allUntuk mempelajari lebih lanjut, lihat dokumentasi Goreleaser.
Kami juga mengekspos API yang didukung untuk penandatanganan, pengemasan, dan notaris file menggunakan bahasa pemrograman GO. Silakan lihat dokumentasi GO tertaut untuk lebih jelasnya.
Perpustakaan yang terpapar dengan sengaja tingkat yang lebih rendah dan memisahkan tanda, paket, notaris, dan langkah stapling. Ini memungkinkan Anda mengintegrasikan fungsionalitas ini ke dalam alat apa pun dengan mudah vs. memiliki pengalaman gon -CLI yang bertentangan.
Anda mungkin mengaktifkan Apple 2FA. Anda harus menghasilkan kata sandi aplikasi dan menggunakannya alih -alih kata sandi ID Apple Anda.
Ini adalah beberapa hal yang ingin saya lihat tetapi saat ini tidak diterapkan.