このページでは、macOS アプリケーションのコード署名と公証のプロセスについて詳しく説明します。
コード署名は、アプリケーションのコード署名を作成するプロセスです。コード署名は、アプリケーションの整合性を保証し、あらゆる改ざんから保護します。Apple のデバイスは、アプリケーションのコード署名を使用して、開発者がコード署名を作成した後に行われた変更を検出します。アプリケーションにコード署名がない場合は、エンドユーザーがアプリケーションを開く前にデバイスが警告を出します。Unity は、macOS 用にビルドするアプリケーションのコード署名を自動で行います。
公証とは、“アプリケーションに Developer ID コード署名があり、悪意のあるコンテンツが含まれていない” ことが Apple によって検証されたことを示すものです。公証に関する詳細は、Apple のドキュメント macOS Code Signing in Depth (macOS のコード署名の詳細) および Notarizing macOS Software Before Distribution (配信に先駆けた macOS ソフトウェアの公証) を参照してください。
Apple デバイスで開発する場合は、Xcode、Xcode のコマンドラインツール、または Unity Cloud Build を使用して、アプリケーションの公証を受けることができます。Apple デバイスを所有していない場合は Unity Cloud Build を使用してください。
このページには、公証の方法に関する以下の情報を掲載しています。
ノート: Mac App Store でアプリケーションを配信する場合、公証は必要ありません。Mac App Store のアップロードプロセスには、公証に類似したコンテンツ検証が含まれています。詳細は Mac App Store への配信 を参照してください。
Unity は、ビルドプロセス中に、Unity プロジェクトを表す Xcode プロジェクトを作成することができます。この Xcode プロジェクトを使用してアプリケーションの公証を受けることが可能です。Unity プロジェクトからの Xcode プロジェクトの作成は、macOS アプリケーションのビルド に記載されている手順で行ってください。Xcode プロジェクトの公証に関する情報は、Apple のドキュメント Notarizing macOS Software Before Distribution (配信前の macOS ソフトウェアの公証) を参照してください。
Xcode 環境でアプリケーションの公証を受けられない場合や、公証処理を手動で制御したい場合は、Xcode のコマンドラインツールが使用可能です。これを行うには以下が必要です。
Xcode のコマンドラインツールを使用してアプリケーションの公証を受けるには、まずアプリケーションにコード署名する必要があります。このセクションでは、Xcode のコマンドラインツールを使用してアプリケーションにコード署名を行う方法を説明します。
Unity は、その生成する全ての macOS ビルドにコード署名を追加します。この単純なコード署名は、開発者個人を識別するものではありません。Apple は、アプリケーションの公証を行うにあたって、開発者を識別する暗号署名がコード署名に含まれていることを必要とします。これは署名 ID と呼ばれます。通常は、Developer ID 証明書を使用します。
新しい Developer ID 証明書を作成するには、Create a New Certificate にアクセスし、以下を行ってください。
.cer
です。Apple は、アプリケーションを公証するにあたって、アプリケーションを識別する必要があります。アプリケーションの識別子の取得は、2 つの方法 (Unity で取得する方法と、ビルドされたアプリケーションの 情報プロパティリストファイル 内で取得する方法) で行えます。
アプリケーション識別子が取得できたら、それを Apple に登録できます。これは以下の手順で行えます。
エンタイトルメントとは、コード署名に含まれる権限や制限で、アプリケーションが特定のアクションを取ることを許可したり防止したりするものです。
アプリケーションのエンタイトルメントの設定は、以下の手順で行えます。
.entitlements
を付加したファイルを作成します。例えば、アプリケーションの名前が Sample であれば、Sample.entitlements
という名前のファイルを作成します。<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
</dict>
</plist>
これらのエンタイトルメントは、macOS アプリケーションが Hardened Runtime を使用するための必要最低限のエンタイトルメントです。アプリケーションにこれ以上のエンタイトルメントが必要な場合は、このリストに追加してください。
コード署名の処理にはコマンドラインが使用されます。開始するには、ターミナルを開き、アプリケーションのあるディレクトリに移動します。コード署名の処理に必要な読み取り権限があることを確認するために、以下のコマンドを実行してください。"application_name.app"
はアプリケーションの名前です。
chmod -R a+xr "application_name.app"
コード署名は特定の署名 ID を使用します。通常これは、Developer ID Application の署名 ID です。ただし、Mac App Store などの一部のデジタル配布サービスでは、別の署名 ID が必要です。
アプリケーションにコード署名するには、以下のコマンドを実行してください。
"application_name.app"
は、ビルドしたアプリケーションです。"application_name.entitlements"
は、エンタイトルメントファイル の名前です。"Developer ID Application : XXX (YYY)"
は、署名 ID です。codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements "application_name.entitlements" --sign "Developer ID Application : XXX (YYY)" "application_name.app"
このコマンドは、アプリケーションバンドルフォルダー内を再帰的に移動し、全てのファイルに署名し、安全なタイムスタンプを追加し、署名内に設定されたエンタイトルメントを埋め込みます。
注意: --deep
オプションを使用すると、コード署名に問題が発生する可能性があります。その理由は以下の通りです。
このオプションは、署名対象の全てのコードに、同じコード署名オプションとエンタイトルメントを適用するため。
このオプションは、その見つけたコードファイルにのみ署名するため。システムがデータを見つけることを想定している場所にコードファイルがある場合、--deep
は、そうしたコードファイルには署名しません。
--deep
オプションについての詳細と、それに関連する問題の解決方法については、Sign Your Code (コードに署名する) を参照してください。
アプリケーションにコード署名を行ったら、それを Apple のウェブサイトにアップロードして公証を受ける必要があります。アップロードの要件を満たすには、以下が必要です。
Apple は、公証のためにアプリケーションをアップロードする前にアプリケーションを圧縮することを要件として設けています。これは以下の手順で行ってください。
ターミナルを開き、アプリケーションのあるディレクトリに移動します。
"application_name.app"
は、ビルドしたアプリケーションです。"application_name.zip"
は、生成する圧縮ファイルの名前です。ditto -c -k --sequesterRsrc --keepParent "application_name.app" "application_name.zip"
これにより、アプリケーションが圧縮され、アプリケーションと同じディレクトリに圧縮ファイルが出力されます。
Apple は、アプリケーションを公証するにあたって、特定の形式の固有のパスワードを必要とします。App 用パスワードを生成するには Apple ID が必要です。Apple ID を持っていない場合は、Apple ID 管理ページ にアクセスして作成してください。
App 用パスワードの生成方法については、App 用パスワードの作成方法 を参照してください。生成されるパスワードには xxxx-xxxx-xxxx-xxxx
という形式が使用されます。
プロバイダーのショートネームは、個人または企業を識別するための一語のラベルです。Apple は、Apple ID が複数の組織に関連付けられている場合に、どの組織に対して公証を行うか特定するためにプロバイダーのショートネームを使用します。プロバイダーのショートネームは以下の方法で取得できます。
apple_id
は Apple ID です。xxxx-xxxx-xxxx-xxxx
は App 用パスワード です。xcrun iTMSTransporter -m provider -u apple_id -p xxxx-xxxx-xxxx-xxxx
Apple からアプリケーションの公証を受けるには、アプリケーションを公証サーバーにアップロードする必要があります。これは、以下の手順で行います。
apple_id
は Apple ID です。xxxx-xxxx-xxxx-xxxx
は App 用パスワード です。provider_short_name
は、プロバイダーのショートネーム です。application_bundle_id
は、アプリケーションの アプリケーション識別子 です。application_name.zip
は、圧縮されたアプリケーション です。xcrun altool --notarize-app --username apple_id --password xxxx-xxxx-xxxx-xxxx --asc-provider provider_short_name --primary-bundle-id application_bundle_id --file application_name.zip
アップロードが成功すると、Apple が、リクエスト ID を含む応答をターミナルに表示します。このリクエスト ID を使用して、リクエストの状況を確認できます。サービスへのトラフィック状況によっては、公証プロセスに何時間かかかる場合があるため、これは役に立ちます。方法は以下の通りです。
request_id
は、Apple が上記のコマンドから返すリクエスト ID です。apple_id
は Apple ID です。xxxx-xxxx-xxxx-xxxx
は App 用パスワード です。provider_short_name
は、プロバイダーのショートネーム です。xcrun altool --notarization-info request_id --username apple_id --password xxxx-xxxx-xxxx-xxxx --asc-provider provider_short_name
公証プロセスが完了すると、Apple から、Apple ID に関連付けられたアドレスに、確認メールが送られます。その後で、公証が成功したかどうか確認することができます。これは以下のように行います。
application_name.app
は、アプリケーションの名前です。spctl -a -v application_name.app
公証が成功した場合は、これにより、Apple がアプリケーションを受理したことを示す、Developer ID を含むメッセージが返されます。
公証を受けたアプリケーションは、“コード署名付きで、悪意のあるコンテンツを含まないもの” として、全ての実行デバイスで検証可能になります。ただし、デバイスはこの検証をオンラインでしか実行できません。インターネットに接続されていないデバイスでアプリケーションを検証するには、アプリケーションを ステープル (Staple/ホチキス留め) する必要があります。ステープルに関する詳細は、Staple the Ticket to Your Distribution (配信物にチケットをステープルする) を参照してください。
アプリケーションのステープルは、以下の手順で行います。
xcrun stapler staple "ApplicationName.app"
を実行します。"ApplicationName.app"
はアプリケーション名です。Unity Cloud Build では、macOS アプリケーションの公証とステープルをビルドプロセス中に行えます。Unity は、これを行うために以下を必要とします。
.p12
ファイルの作成に使用したパスワード開発を行うプラットフォームによって、これらの要件の一部のプロセスが異なります。Apple デバイス上で開発する場合は、Xcode コマンドラインツールを使用して情報の取得と関連ファイルの作成が行えます。Windows や Linux で開発する場合は、Apple 固有の Xcode コマンドラインツールは使用できません。
どのプラットフォームを使用する場合も、Apple ID、パスワード、エンタイトルメントファイルの取得方法は同じです。
上記の手順が完了したら、以下を確認してください。
Apple デバイスで開発する場合、Xcode コマンドラインツールを使用して、Unity Cloud Build を使用した公証 に記載の要件を満たすことができます。その後、Unity Cloud Build を設定し、ビルドプロセスの一環として、アプリケーションの公証を受け、ステープルすることができます。要件を満たすには、以下を行ってください。
.p12
) 形式のファイルとしてエクスポートします。この方法については、Import and export keychain items using Keychain Access on Mac (Mac で Keychain Access を使用してキーチェーンアイテムをインポートおよびエクスポートする) を参照してください。要件を満たした後で、Unity Cloud Build の公証フォーム に必要事項を記入し、提出します。
Windows または Linux で開発する場合、macOS 用アプリケーションのビルド、公証、ステープルに Xcode コマンドラインツールは使用できません。Unity Cloud Build を使用した公証 に記載の要件を満たし、アプリケーションの公証とステープルをビルドプロセスの一環として行うように Unity Cloud Build を設定するには、以下の手順に従ってください。
要件を満たした後で、Unity Cloud Build の公証フォーム に必要事項を記入し、提出します。
.p12
ファイルは、Developer ID 証明書と秘密鍵の両方をバンドルします。以下の手順で、このファイルを Developer ID 証明書から作成できます、
コマンドラインのインターフェースを開き、Developer ID 証明書ファイルがあるディレクトリに移動します。Developer ID 証明書をダウンロードしていない場合は、署名 ID を参照してください。
.cer
ファイル形式が使用されています。このファイルを .pem
ファイル形式に変換してください。これを行うには、以下のコマンドを実行します。
developer_identity.cer
は、変換する Developer ID 証明書ファイルです。developer_identity.pem
は、出力するファイルの名前とファイルタイプです。openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM
mykey.key
、出力する秘密鍵のファイル名です。openssl genrsa -out mykey.key 2048
.p12
ファイルを生成します。これを行うには、以下のコマンドを実行します。
mykey.key
は、手順 3 で生成した秘密鍵のファイルです。developer_identity.pem
は、手順 2 で生成した .pem
ファイルです。openssl pkcs12 -export -inkey mykey.key -in developer_identity.pem -out iphone_dev.p12
Unity Cloud Build を使用した公証 に記載されている要件を満たした後で、以下の手順に従って Unity Cloud Build 公証を設定してください。
.p12
ファイルです。.p12
ファイルの作成時に入力したパスワードです。--deep --force --verify --verbose --timestamp --options runtime
フラグで codesign
コマンドを実行します。カスタムフラグの指定は現時点では不可能です。FASTLANE_NOTARIZE_VERBOSE=true
を使用して、公証からの追加的なログ出力が利用可能です。