Version: 2022.3
言語: 日本語
macOS ビルド設定
Mac App Store へのアプリケーションの配信

macOS アプリケーションのコード署名と公証

このページでは、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 への配信 を参照してください。

Xcode を使用したアプリケーションの公証

Unity は、ビルドプロセス中に、Unity プロジェクトを表す Xcode プロジェクトを作成することができます。この Xcode プロジェクトを使用してアプリケーションの公証を受けることが可能です。Unity プロジェクトからの Xcode プロジェクトの作成は、macOS アプリケーションのビルド に記載されている手順で行ってください。Xcode プロジェクトの公証に関する情報は、Apple のドキュメント Notarizing macOS Software Before Distribution (配信前の macOS ソフトウェアの公証) を参照してください。

Xcode のコマンドラインツールを使用したアプリケーションの公証

Xcode 環境でアプリケーションの公証を受けられない場合や、公証処理を手動で制御したい場合は、Xcode のコマンドラインツールが使用可能です。これを行うには以下が必要です。

アプリケーションのコード署名

Xcode のコマンドラインツールを使用してアプリケーションの公証を受けるには、まずアプリケーションにコード署名する必要があります。このセクションでは、Xcode のコマンドラインツールを使用してアプリケーションにコード署名を行う方法を説明します。

署名 ID

Unity は、その生成する全ての macOS ビルドにコード署名を追加します。この単純なコード署名は、開発者個人を識別するものではありません。Apple は、アプリケーションの公証を行うにあたって、開発者を識別する暗号署名がコード署名に含まれていることを必要とします。これは署名 ID と呼ばれます。通常は、Developer ID 証明書を使用します。

新しい Developer ID 証明書を作成するには、Create a New Certificate にアクセスし、以下を行ってください。

  1. プロンプトに従って秘密鍵を作成し、Certificate Signing Request をアップロードします。
  2. Developer ID 証明書をダウンロードします。この証明書のファイル形式は .cer です。
  3. 証明書をクリックしてキーチェーンに追加します。キーチェーン内に Developer ID Application : XXX (YYY) といった形式で名前が表示されます。

アプリケーション識別子

Apple は、アプリケーションを公証するにあたって、アプリケーションを識別する必要があります。アプリケーションの識別子の取得は、2 つの方法 (Unity で取得する方法と、ビルドされたアプリケーションの 情報プロパティリストファイル 内で取得する方法) で行えます。

  • Unity で取得する方法
    1. Edit > Project Settings > Player を開きます。
    2. Other Settings セクションを展開し、Mac App Store Options を開きます。
    3. Bundle Identifier の値を確認してください。
  • 情報プロパティリストファイル内で取得する方法
    1. Finder で、ビルドしたアプリケーションに移動します。
    2. アプリケーションを右クリックし、Show Package Contents を選択します。
    3. Contents へ移動し、Info.plist を開きます。
    4. アプリケーション識別子を表すキーは CFBundleIdentifier です。

アプリケーション識別子が取得できたら、それを Apple に登録できます。これは以下の手順で行えます。

  1. Apple Developer にアクセスし、ログインしてください。
  2. Certificates, IDs & Profiles を選択します。
  3. Identifiers を選択します。
  4. バンドル ID を追加します。

エンタイトルメント

エンタイトルメントとは、コード署名に含まれる権限や制限で、アプリケーションが特定のアクションを取ることを許可したり防止したりするものです。

アプリケーションのエンタイトルメントの設定は、以下の手順で行えます。

  1. ビルドしたアプリケーションと同じディレクトリに、アプリケーションと同じ名前にファイル拡張子 .entitlements を付加したファイルを作成します。例えば、アプリケーションの名前が Sample であれば、Sample.entitlements という名前のファイルを作成します。
  2. このファイルをテキストエディターで開き、以下の内容をファイル内にコピーしてください。
<?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 は、公証のためにアプリケーションをアップロードする前にアプリケーションを圧縮することを要件として設けています。これは以下の手順で行ってください。

  1. ターミナルを開き、アプリケーションのあるディレクトリに移動します。

  2. 以下のコマンドを実行します。
    • "application_name.app" は、ビルドしたアプリケーションです。
    • "application_name.zip" は、生成する圧縮ファイルの名前です。
ditto -c -k --sequesterRsrc --keepParent "application_name.app" "application_name.zip"

これにより、アプリケーションが圧縮され、アプリケーションと同じディレクトリに圧縮ファイルが出力されます。

App 用パスワードの生成

Apple は、アプリケーションを公証するにあたって、特定の形式の固有のパスワードを必要とします。App 用パスワードを生成するには Apple ID が必要です。Apple ID を持っていない場合は、Apple ID 管理ページ にアクセスして作成してください。

App 用パスワードの生成方法については、App 用パスワードの作成方法 を参照してください。生成されるパスワードには xxxx-xxxx-xxxx-xxxx という形式が使用されます。

プロバイダーのショートネームの取得

プロバイダーのショートネームは、個人または企業を識別するための一語のラベルです。Apple は、Apple ID が複数の組織に関連付けられている場合に、どの組織に対して公証を行うか特定するためにプロバイダーのショートネームを使用します。プロバイダーのショートネームは以下の方法で取得できます。

  1. ターミナルを開きます。
  2. 以下の Xcode コマンドを実行します。
xcrun iTMSTransporter -m provider -u apple_id -p xxxx-xxxx-xxxx-xxxx

アップロードプロセスの開始

Apple からアプリケーションの公証を受けるには、アプリケーションを公証サーバーにアップロードする必要があります。これは、以下の手順で行います。

  1. ターミナルを開き、圧縮されたアプリケーション があるディレクトリに移動します。
  2. 以下のコマンドを実行します。
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 を使用して、リクエストの状況を確認できます。サービスへのトラフィック状況によっては、公証プロセスに何時間かかかる場合があるため、これは役に立ちます。方法は以下の通りです。

  1. ターミナルを開き、圧縮されたアプリケーション があるディレクトリに移動します。
  2. 以下のコマンドを実行します。
xcrun altool --notarization-info request_id --username apple_id --password xxxx-xxxx-xxxx-xxxx --asc-provider provider_short_name

公証プロセスが完了すると、Apple から、Apple ID に関連付けられたアドレスに、確認メールが送られます。その後で、公証が成功したかどうか確認することができます。これは以下のように行います。

  1. ターミナルを開き、アプリケーションのあるディレクトリに移動します。
  2. 以下のコマンドを実行します。
    • application_name.app は、アプリケーションの名前です。
spctl -a -v application_name.app

公証が成功した場合は、これにより、Apple がアプリケーションを受理したことを示す、Developer ID を含むメッセージが返されます。

アプリケーションのステープル

公証を受けたアプリケーションは、“コード署名付きで、悪意のあるコンテンツを含まないもの” として、全ての実行デバイスで検証可能になります。ただし、デバイスはこの検証をオンラインでしか実行できません。インターネットに接続されていないデバイスでアプリケーションを検証するには、アプリケーションを ステープル (Staple/ホチキス留め) する必要があります。ステープルに関する詳細は、Staple the Ticket to Your Distribution (配信物にチケットをステープルする) を参照してください。

アプリケーションのステープルは、以下の手順で行います。

  1. ターミナルを開き、アプリケーションのあるディレクトリに移動します。
  2. コマンド xcrun stapler staple "ApplicationName.app" を実行します。"ApplicationName.app" はアプリケーション名です。

Unity Cloud Build を使用した公証

Unity Cloud Build では、macOS アプリケーションの公証とステープルをビルドプロセス中に行えます。Unity は、これを行うために以下を必要とします。

開発を行うプラットフォームによって、これらの要件の一部のプロセスが異なります。Apple デバイス上で開発する場合は、Xcode コマンドラインツールを使用して情報の取得と関連ファイルの作成が行えます。Windows や Linux で開発する場合は、Apple 固有の Xcode コマンドラインツールは使用できません。

どのプラットフォームを使用する場合も、Apple ID、パスワード、エンタイトルメントファイルの取得方法は同じです。

  1. Apple ID を持っていない場合は、Apple ID 管理ページ にアクセスして作成してください。
  2. App 用パスワードを作成します。この方法については、App 用パスワードの生成 を参照してください。
  3. Apple Developer のメンバーシップを持っていない場合は、Apple Developer でサインアップしてください。
  4. アプリケーション用のエンタイトルメントファイルを作成します。この方法については、エンタイトルメント を参照してください。

上記の手順が完了したら、以下を確認してください。

Apple デバイスでの Unity Cloud Build による公証

Apple デバイスで開発する場合、Xcode コマンドラインツールを使用して、Unity Cloud Build を使用した公証 に記載の要件を満たすことができます。その後、Unity Cloud Build を設定し、ビルドプロセスの一環として、アプリケーションの公証を受け、ステープルすることができます。要件を満たすには、以下を行ってください。

  1. Unity Cloud Build を使用した公証 に記載されている、プラットフォームに依存しない手順に従ってください。
  2. Developer ID 証明書を作成し、キーチェーンに追加します。この方法については、署名 ID を参照してください。
  3. キーチェーンから Developer ID 証明書を Personal Information Exchange (.p12) 形式のファイルとしてエクスポートします。この方法については、Import and export keychain items using Keychain Access on Mac (Mac で Keychain Access を使用してキーチェーンアイテムをインポートおよびエクスポートする) を参照してください。
  4. プロバイダーのショートネームを取得します。この方法については、プロバイダーのショートネームの取得 を参照してください。

要件を満たした後で、Unity Cloud Build の公証フォーム に必要事項を記入し、提出します。

Windows および Linux デバイスでの Unity Cloud Build による公証

Windows または Linux で開発する場合、macOS 用アプリケーションのビルド、公証、ステープルに Xcode コマンドラインツールは使用できません。Unity Cloud Build を使用した公証 に記載の要件を満たし、アプリケーションの公証とステープルをビルドプロセスの一環として行うように Unity Cloud Build を設定するには、以下の手順に従ってください。

  1. Unity Cloud Build を使用した公証 に記載されている、プラットフォームに依存しない手順に従ってください。
  2. Developer ID 証明書を作成し、ダウンロードします。これを行う方法は、署名 ID を参照してください。ノート: 署名 ID の最後のステップは、macOS ユーザーのみに関連するものです。
  3. Developer ID 証明書を PKCS #12 Personal Information Exchange (.p12) ファイル形式に変換します。これを行う方法は、Windows および Linux で Developer ID 証明書を .p12 ファイルに変換する を参照してください。
  4. Apple Developer アカウントからプロバイダーのショートネームを取得します。これを行うには、メンバーシップの詳細 にアクセスし、 チーム ID を見つけてください。チーム ID をプロバイダーのショートネームとして使用できます。

要件を満たした後で、Unity Cloud Build の公証フォーム に必要事項を記入し、提出します。

Windows および Linux で Developer ID 証明書を .p12 ファイルに変換する

.p12 ファイルは、Developer ID 証明書と秘密鍵の両方をバンドルします。以下の手順で、このファイルを Developer ID 証明書から作成できます、

  1. コマンドラインのインターフェースを開き、Developer ID 証明書ファイルがあるディレクトリに移動します。Developer ID 証明書をダウンロードしていない場合は、署名 ID を参照してください。

  2. Developer 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

  3. 新しい秘密鍵を生成します。これを行うには、以下のコマンドを実行します。
    • mykey.key、出力する秘密鍵のファイル名です。

    openssl genrsa -out mykey.key 2048

  4. .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 を使用した公証 に記載されている要件を満たした後で、以下の手順に従って Unity Cloud Build 公証を設定してください。

  1. Unity Cloud Build を使用するようにプロジェクトを設定します。方法については Unity Cloud Build を参照してください。
  2. Cloud Build で新しい Mac Desktop ビルドターゲットを作成します。
  3. Config ページに戻ります。このページに、Notarization (公証) のセクションが含まれるようになりました。このセクションを開き、EDIT NOTARIZATION をクリックしてください。
    Config ページに提供されるセクション
  4. Notarization フラグを有効にします。以前に同じ組織の公証認証情報を Unity Cloud Build に提供したことがある場合は Credentials からそれを選択できます。そうでない場合は Add new provisioning credentials を選択してください。
    認証情報のドロップダウン
  5. 以下を提供してください。
  6. 認証情報を保存します。
  7. Build History ページに戻り、Mac ターゲット用のビルドを開始します。
  8. ビルドが成功すると、Unity Cloud Build は結果の公証とステープルを試みます。
    • Cloud Build が、--deep --force --verify --verbose --timestamp --options runtime フラグで codesign コマンドを実行します。カスタムフラグの指定は現時点では不可能です。
    • ビルドターゲット Environment Variables 内の環境変数 FASTLANE_NOTARIZE_VERBOSE=true を使用して、公証からの追加的なログ出力が利用可能です。
  9. Unity Cloud Build によるプロジェクトのビルド、公証、ステープルの処理が完了したら、ビルドの含まれた圧縮ファイルがダウンロード可能になります。
macOS ビルド設定
Mac App Store へのアプリケーションの配信