アーカイブ:残念ながら、このプロジェクトを積極的に使用しておらず、2022年初頭から適切に維持されていません。フォークを歓迎し、このプロジェクトを引き継ぎます。
Gonは、MacOSのCLIバイナリを署名して公証するためのシンプルで飾り気のないツールです。 Gonは、手動または自動化パイプラインで実行できるCLIとして利用できます。また、Goで書かれたプロジェクトに埋め込むためのGOライブラリとしても利用できます。 Gonは、あらゆる言語で書かれたバイナリに署名し、公証できます。
Macos Catalina(10.15)から始めて、AppleはMac App Storeの外に配布されているすべてのソフトウェアを署名し、公証することを要求しています。適切に署名されていない、または公証されていないソフトウェアには、「ビンに移動」することが実行可能な唯一のオプションがあるエラーメッセージが表示されます。コマンドラインからでもソフトウェアを実行することはできません。回避策はユーザーにとって苦痛です。 Gonは、公証化のプロセスを自動化するのに役立ちます。
サポートしたい機能については、まだロードマップを参照してください。
以下の例は、 gon自身に対して実行して、ZIPとDMGを生成します。

gonをインストールする最も簡単な方法は、HomeBrew経由です。
$ brew install mitchellh/gon/gon
また、リリースページからプラットフォームの適切なリリースをダウンロードすることもできます。これらはすべて署名されており、MacOS 10.15+の箱を使い果たすように公証されています。
Go 1.13以降を使用してStandard go build使用してソースからコンパイルすることもできます。 GOモジュールが有効になっていることを確認してください。
gonには、ファイルパスとして指定したり、Stdin経由で渡されたりできる構成ファイルが必要です。構成は、 gonファイルに署名してパッケージ化するために使用するすべての設定を指定します。
Gonは、Xcode 11.0以降のMacOSマシンで実行する必要があります。コード署名、公証化、パッケージングにはすべて、MacOSマシンでのみ利用可能なツールが必要です。
$ gon [flags] [CONFIG]
実行されると、 gonは設定されたファイルに署名、パッケージ化、および要求された形式に公開されます。 gon 、成功に関する0出口コードと失敗時のその他の値で終了します。
gonを使用する前に、開発者ID証明書を取得する必要があります。これを行うには、Mac上のWebまたはXcodeを介してローカルで行うことができます。 Xcodeの使用は、既にインストールされている場合は簡単です。
Web経由:
有効なApple ID資格情報を使用して、developer.apple.comにサインインします。 Apple開発者アカウントにサインアップする必要がある場合があります。
証明書ページに移動します。
「+」アイコンをクリックし、[開発者IDアプリケーション]を選択し、手順に従ってください。
証明書をダウンロードした後、ダブルクリックしてキーチェーンにインポートします。 CIマシンに基づいて構築されている場合、すべてのCIマシンはキーチェーンにこの証明書を持っている必要があります。
Xcode経由:
xcodeを開き、xcode => fearmences => accountsに移動します
左下の「+」をクリックして、まだお届けしていない場合はApple IDを追加します。
Appleアカウントを選択し、右下隅の[証明書の管理]をクリックします。
左下隅の「+」をクリックして、「開発者IDアプリケーション」をクリックします。
リスト内の新しく作成されたCERTを右クリックし、[エクスポート]をクリックし、P12形式の証明書としてファイルをエクスポートします。これをどこかに保存します。二度とダウンロードすることはできません。
これを正しく行うことを確認するために、キーチェーンを検査できます。
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities found1つ以上の証明書が表示され、少なくとも1つは開発者IDアプリケーション証明書である必要があります。 Hexadecimal文字列のプレフィックスは、設定ファイルで使用して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> ) - 署名、パッケージ、および公証されるファイルのリスト。異なるIDまたは異なるパッケージに複数のファイルに署名する場合は、個別の構成でgonを呼び出す必要があります。これは、 notarizeブロックを使用してNotarizationのみのモードを使用している場合にオプションです。
bundle_id ( string ) - アプリケーションのバンドルID。アプリケーション用にユニークなものを選択する必要があります。これらをAppleに登録することもできます。これは、 notarizeブロックを使用してNotarizationのみのモードを使用している場合にオプションです。
apple_id公証に使用するApple IDに関連する設定。
username ( string ) - Apple IDユーザー名、通常はメールアドレス。これは、設定されていない場合、 AC_USERNAME環境変数にデフォルトになります。
password ( string ) - 関連するApple IDのパスワード。これを直接指定するか、 @keychain:<name>または@env:<name>を使用して、Plantextパスワードを構成ファイルに直接配置しないようにします。 @keychain:<name> Syntaxは、MacOSキーチェーンのパスワードを指定された名前でロードします。 @env:<name> syntaxは、指定された環境変数からパスワードをロードします。この値が設定されていない場合は、 AC_PASSWORD環境変数をデフォルトとして使用しようとします。
注:2FAを有効にしている場合、パスワードは通常のApple IDパスワードではなく、アプリケーションパスワードである必要があります。詳細については、トラブルシューティングを参照してください。
provider ( string ) - App Store Connect内で複数のチームを使用する場合、App Store Connectプロバイダー。これが設定されていない場合は、 AC_PROVIDER環境変数をデフォルトとして読み取ろうとします。
sign - 署名ファイルに関連する設定。
application_identity ( string ) - アプリケーションに署名するために使用する「開発者IDアプリケーション」証明書の名前またはID。これは、macOSのcodesignバイナリの-sフラグの有効な値を受け入れます。受け入れられた値に関する詳細なドキュメントについては、 man codesign参照してください。
entitlements_file ( string optional ) codesignプリスト形式へのフルパス--entitlementsファイル。
dmg (オプション) - 出力としてディスクイメージ(DMG)の作成に関連する設定。これは、これが指定されている場合にのみ作成されます。また、DMGには、オフラインで検証できるようにし、インターネットを使用する必要がないように、公証チケットをホチキス止めします。
output_path ( string ) - zipアーカイブを作成するパス。このパスが既に存在する場合、上書きされます。 source内のすべてのファイルは、ZIPアーカイブのルートにコピーされます。
volume_name ( string ) - ファインダー、マウントされたファイルパスなどに表示されるマウントされたDMGの名前。
zip (オプション) - zipアーカイブの作成に関連する設定出力として。 ZIPアーカイブは、これが指定されている場合にのみ作成されます。 ZIPアーカイブはステープル操作をサポートしていないことに注意してください。つまり、公証されたZIPアーカイブ内のファイルは、最初の使用を確認するためにインターネット接続が必要であることを意味します。
output_path ( string ) - zipアーカイブを作成するパス。このパスが既に存在する場合、上書きされます。 source内のすべてのファイルは、ZIPアーカイブのルートにコピーされます。公証のみのモード:
notarize (オプション) - すでに構築されたファイルを公証するための設定。これは、 sourceオプションを使用する代替品です。このオプションは、複数のファイルを公証するために繰り返すことができます。
path ( string ) - 公証するファイルへのパス。これは、DMG、PKG、APP、またはZIPの公証化のためのAppleのサポートされているファイルタイプの1つでなければなりません。
bundle_id ( string ) - この公証化に使用するバンドルID。これは、トップレベルのbundle_id (ソースベースの実行の値を制御する)の代わりに使用されます。
staple ( bool ) - 公証化が成功した場合にstapler stapleが実行されるかどうかを制御します。これは、それをサポートするフィルタイプ(DMG、PKG、またはAPP)に対してのみ設定する必要があります。
既に署名したファイルを公証するようにgonを構成できます。これは、PKG、APPなどのファイルの作成を既にサポートする可能性のある既存のビルドパイプラインに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に提出し、それらがスキャンするのを待つ必要があります。 Appleは、私が知る限り、公共のSLAを提供していません。
gonの開発と公証プロセスの開発では、このプロセスが平均して速い(10分未満)ことがわかりましたが、場合によっては、1時間以上公証化リクエストが測定されています。
gonステータスの更新を出力し、公証化が完了するのを無期限に待ちます。 gonが中断された場合、提出後にgon出力するリクエストUUIDを使用して、リクエストのステータスを自分で確認できます。
gon 、CIパイプラインなどの自動環境内での実行をサポートするために構築されています。この環境では、 gonと-log-jsonフラグを使用してJSON構成ファイルを使用して、構造化されたロギング出力を取得する必要があります。
gon 、常にSTDOUT(エラーを含む)で人間の読み取り可能な出力を出力し、STDERのすべてのログ出力を出力します。 -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がサブプロセスしているAppleソフトウェアから発信されます。
現在、承認をスクリプト化する方法がわからないため、ビルドマシンに関する推奨事項は、一度手動でgon実行することです。誰かがこれを自動化する方法を見つけた場合は、問題を開いてください、私に知らせてください、そして私はこのreadmeを更新します。
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を公開します。詳細については、Linked Goドキュメントをご覧ください。
露出したライブラリは、意図的に低いレベルであり、サイン、パッケージ、公証、およびステープル段のステップを分離します。これにより、この機能をあらゆるツールに簡単gon統合できます。
Apple 2FAを有効にする可能性があります。アプリケーションパスワードを生成し、Apple IDパスワードの代わりに使用する必要があります。
これらは私が見たいと思っていますが、現在実装されていないものです。