前提条件
Mac で署名および notarization を開始するには、以下の前提条件が必要です。
- Xcode 13 を実行可能な Mac (macOS 11.3 以降を実行できる必要があります)。なお、Xcode のインストールには 25 GB の空き容量が必要です。
- Apple Developer ID および Apple Developer ID Application 証明書。
- MATLAB R2020a 以降。なお、"RuntimeDelivery" オプションを 'installer' に設定したアプリケーションインストーラーを notarization したい場合は、MATLAB R2021b 以降が必要です。
上記を準備したら、コンパイル済みアプリの notarization を開始できます。
コンパイル済みアプリケーションを notarization する手順
1. Xcode を使用して "entitlements.plist" ファイルを作成します。
Entitlements とは、コード署名に含める特別な権限であり、署名済みアプリが特定の操作を実行できるようにするものです。Xcode でコンパイルする場合は、そのプロセスの一部として設定できます。しかし MATLAB コンパイル済みアプリに Entitlements を追加する場合は、このファイルを手動で作成する必要があります。
Xcode で新しい plist ファイルを作成するには、"New File" を選択し、その後 "Property List" を選択します。"Root" ディクショナリに必要な entitlement の名前を追加し、それぞれを boolean:YES に設定します。
MATLAB コンパイル済みアプリケーションは実行時に DYLD_LIBRARY_PATH 環境変数を設定する権限が必要です。詳細は以下を参照してください。
そのため、以下の Entitlements を許可する必要があります。
com.apple.security.cs.allow-jit
com.apple.security.cs.disable-library-validation
com.apple.security.cs.allow-dyld-environment-variables
最終的にファイルはこれらの項目を含む構成になります。
2. Entitlements を指定してアプリケーションにコード署名します。
アプリバンドル内のすべての実行ファイルおよび動的ライブラリは、それぞれ個別に署名する必要があります。使用するライブラリによっては、すでに署名済みの場合もあります。最終的にバンドル全体へ署名する前に、それぞれへ署名していく方法を推奨します。
codesign を使用する場合、既存の署名は維持されます。
例えば単純な "HelloWorld" アプリの場合、手順は以下のようになります。
- アプリ生成前に、すべての MEX ファイル依存関係 (存在する場合) にコード署名します。
- 署名済み MEX ファイルを使用して、mcc または deploytool でアプリケーションをコンパイルします。
- /Contents/MacOS/applauncher にコード署名します。
- /Contents/MacOS/HelloWorld にコード署名します。
- /Contents/MacOS/prelaunch にコード署名します。
- バンドル全体にコード署名します。
注記 1
prelaunch は app launcher および HelloWorld 実行ファイルへの署名後に署名する必要があります。そうしないとエラーになります。
注記 2
各実行ファイルは個別に署名し、アプリ全体を署名する際に --deep フラグを使用しないでください。後でアプリをインストーラーにパッケージ化する際、notarization エラーの原因となります。
この例の codesign コマンドは次のとおりです。
Mac-Machine:HelloWorld.app username$ cd Contents/MacOS/
Mac-Machine:MacOS username$ ls
applauncher HelloWorld prelaunch
Mac-Machine:MacOS username$ codesign --verbose=4 --options=runtime -s "<Your Developer ID Application Certificate>" --entitlements entitlements.plist applauncher
applauncher: signed Mach-O thin (x86_64) [applauncher]
Mac-Machine:MacOS username$ codesign --verbose=4 --options=runtime -s "<Your Developer ID Application Certificate>" --entitlements entitlements.plist HelloWorld
HelloWorld: signed Mach-O thin (x86_64) [HelloWorld]
Mac-Machine:MacOS username$ codesign --verbose=4 --options=runtime -s "<Your Developer ID Application Certificate>" --entitlements entitlements.plist prelaunch
prelaunch: signed app bundle with Mach-O thin (x86_64) [HelloWorld]
Mac-Machine:MacOS username$ cd ..
Mac-Machine:Contents username$ cd ..
Mac-Machine:hello.app username$ cd ..
Mac-Machine:standalone username$ codesign --verbose=4 --options=runtime -s "<Your Developer ID Application Certificate>" --entitlements entitlements.plist HelloWorld.app
HelloWorld.app: is already signed
完了後、以下のコマンドでアプリの Entitlements を確認できます。
codesign -d --entitlements - HelloWorld.app
また、署名後も期待どおりに動作することを確認するため、アプリを実際に起動してください。
3. notarization 提出用にアプリケーションを ZIP ファイルへ圧縮します。
手動でもプログラムからでも実行できます。以下のコマンドを使用します。
ditto -c -k --keepParent AppName.app AppName.zip
4. ZIP ファイルを notarization サービスへ送信します。
Xcode を使用して以下のコマンドを実行します。
※ パスワードは Apple ID のパスワードではなく、Apple Developer Web サイトで設定する notarytool 用のアプリ専用パスワードです。
xcrun notarytool submit YourApp.zip --apple-id <appleid> --password <password>
HelloWorld の例:
Mac-Machine:standalone username$ xcrun notarytool submit HelloWorld.zip --apple-id youremail@gmail.com --password <password>
No errors uploading 'HelloWorld.zip'.
RequestUUID = 889a6a12-ecca-4d60-ae84-e0edb3284xxx
xcrun notarytool info <RequestUUID> --apple-id <appleid> --password <password>
HelloWorld の例:
Mac-Machine:standalone username$ xcrun notarytool info 889a6a12-ecca-4d60-ae84-e0edb3284xxx --apple-id youremail@gmail.com --password <password>
No errors getting notarization info.
Date: 2020-07-29 00:49:27 +0000
Hash: 7776e46ad3085840be4ea56875c794b3e81f5684faa32b8fc8b9e4316daa46xx
LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/...
RequestUUID: 889a6a12-ecca-4d60-ae84-e0edb3284xxx
Status: success
Status Code: 0
Status Message: Package Approved
5. app bundle に notarization 承認情報を stapling します。
Xcode を使用して以下を実行します。
xcrun stapler staple YourApp.app
出力例:
Mac-Machine:standalone username$ xcrun stapler staple hello_signed.app
Processing: /Users/username/Documents/MATLAB/standalone/hello_signed.app
Processing: /Users/username/Documents/MATLAB/standalone/hello_signed.app
The staple and validate action worked!
6. アプリが notarization 済みであることを確認します。
以下のコマンドを使用します。
spctl -a -t exec -vvv YourApp.app
署名および notarization が正常に完了している場合、出力は次のようになります。
Mac-Machine:standalone username$ spctl -a -t exec -vvv hello_signed.app
hello_signed.app: accepted
source=Notarized Developer ID
origin=Your Certificate
7. アプリケーションを配布します。
notarization 済みアプリケーションをそのままエンドユーザーへ配布できます。
なお、ユーザーは別途 MATLAB Runtime をインストールする必要があります。
アプリケーションインストーラーを notarization する手順
別の方法として、ターゲットマシンへアプリケーションと MATLAB Runtime の両方をインストールするインストーラーを生成することもできます。この場合は追加の notarization 手順が必要です。
前述のとおり、アプリバンドル内の各実行ファイルおよび動的ライブラリは個別に署名されるため、アプリバンドルは内部から外側への順序で署名する必要があります。
インストーラーを署名する前に、まずアプリ本体を前節の手順に従って署名してください。
1. 前節の手順に従ってスタンドアロンアプリケーションへコード署名します。
2. "compiler.package.installer" コマンドを使用してインストーラーを生成し、署名済みアプリを指定します。
deploytool を使用したインストーラー生成は notarization 対応ではサポートされていません。これは deploytool を使用した場合、インストーラー生成前にスタンドアロンアプリへ署名できないためです。
HelloWorld の例:
compiler.package.installer(...
'helloworld.app','requiredMCRProducts.txt',...
'ApplicationName','hello world')
注記:
R2021b より前のリリースでは、上記コマンドの "RuntimeDelivery" オプションを "web" に設定する必要があります。
オプションを指定しない場合は既定値が "web" です。
"RuntimeDelivery" オプションを 'installer' に設定したインストーラーは、R2021b より前のリリースでは notarization できません。
3. 生成したインストーラーへコード署名します。
codesign コマンドでは "-–deep" フラグを使用しないでください。使用すると notarization 中に prelaunch がエラーを報告する場合があります。
(ログのエラー例)
"path": "MyAppInstaller.zip/MyAppInstaller.app/Contents/Resources/bundle.zip/application/hello.app/Contents/MacOS/prelaunch",
"message": "The signature of the binary is invalid."
4. 署名済みインストーラーを notarization し、stapling を実行します。
手順 3 および 4 の詳細なコマンドについては、「コンパイル済みアプリケーションを notarization する手順」を参照してください。
以上の手順が完了すると、インストーラーおよびアプリケーションは正しく署名および notarization され、配布可能な状態になります。
codesign および notarization コマンドの詳細については、Apple の公式ドキュメントを参照してください。