DriverKitのコード署名の謎を解明する

ドライバーは、Macのオペレーティングシステムが外部ハードウェア周辺機器と通信するのに役立ち、DriverKitはそれらのカスタムドライバーを作成するのに役立ちます。 (たとえば、キーボードドライバーは、アクセントLEDの制御や複雑なマクロ機能の実行など、デバイスの独自の機能の一部を有効にすることができます。)

DriverKitドライバー(またはdext)はオペレーティングシステムの機密部分と通信するため、リリースするドライバーには有効なエンタイトルメントが必要です。 ドライバーを構築およびテストする際の資格とコード署名の管理プロセス、および開発とリリースの両方のプロビジョニングプロファイルを作成する方法について説明します。

DriverKit

Creating a Driver Using the DriverKit SDK

エンタイトルメントなしでドライバーを開発する

DriverKit ドライバーをリリースする前に、ソフトウェアをドライバーとして分類し、サポートされているハードウェアを定義するエンタイトルメントを要求する必要があります。しかし、DriverKitのエンタイトルメントを要求していない、または受け取っていない場合でも、macOSがドライバーのインストール中に実行するセキュリティチェックを一時的に無効にすることで、ドライバーを開発することができます。

Requesting Entitlements for DriverKit Development

Debugging and testing system extensions

これを行うには、システム整合性保護(SIP)を無効にし、System Extension開発者モードを有効にしてください。(詳しくは、開発者向けのドキュメンの「System Extensionsのデバッグとテスト」をご覧ください。)


注:必要なタスクを実行するために一時的にのみSIPを無効にし、できるだけ早く再度有効にしてください。テストが完了したときにSIPを再度有効にしないと、コンピューターが悪意のあるコードに対して脆弱になります。


SIPを再び有効にしたら、DriverKitドライバーのコード署名IDがローカルで実行されるように設定されていることを確認する必要があります。ドライバーのXcodeプロジェクト内で、「Build Settings(ビルド設定)」タブを開き、すべてのターゲットの「Code Signing Identity(コード署名ID)」の値を「Sign to Run Locally(ローカルで実行するために署名)」に変更します。これで、開発マシンでDriverKitドライバーをビルド、テスト、およびデバッグできるようになります。

DriverKitの開発にプロビジョニングプロファイルを使用する

複数のマシンでドライバーをテストする準備ができたら、プロビジョニングプロファイルを作成できるように、有効なDriverKitのエンタイトルメントが必要になります。

手動プロビジョニングプロファイルを設定する Xcodeでは一部の開発識別子やプロビジョニングプロファイルの作業を自動で行うことができますが、DriverKitのdextでは手動でプロビジョニングを設定する必要があります。設定を行うには、まず、developer.apple.comの開発者ポータルにログインし、「Certificates, Identifiers & Profiles(証明書、ID、プロファイル)」セクションに移動します。

「Identifiers(ID)」のセクションでは、dextに関連する新しい識別子を作成する必要があります。このセクションでは、名前の先頭に「XC」が付いている識別子の一覧が表示されます。これらは、Xcodeによってプロジェクト用に自動で作成された識別子です。

新しい識別子を作成する場合は、「App ID」オプションを選択します。DriverKitドライバーは本格的なAppと見なされるため、「App Clip」ではなく、「App ID」オプションを選択するようにしてください。

次に、後で認識できるように、識別子にわかりやすい名前を付けて、dextに明示的なバンドルIDを指定します。(すべての「機能」をスクロールすると、使用可能なオプションを確認いただけます。)

「Additional Entitlements(追加のエンタイトルメント)」セクションが表示されるでしょう。もしUSBDriverKitで使用する特定のベンダーIDが付与されている場合は、必ず「DriverKit USBトランスポート - VendorID」エンタイトルメントを識別子に追加してください。

System Extensionsのエンタイトルメントは、Appがドライバーをインストールできるようにするものであるため、DriverKit ドライバーの「System Extension」オプションを追加でチェックする必要はありません。

System Extension Entitlement

プロファイルを作成する 次に、プロファイルを作成する必要があります。開発中のドライバーで作業を行うため、プロファイルの種類として「macOS App開発」を選択します。

プロファイルをアプリIDに関連付け、プロファイルを動作させたい証明書と開発デバイスを選択し、「追加のエンタイトルメント」セクションで「System ExtensionおよびDriverKitテンプレート」を選択します。これにより、付与されたすべてのDriverKitエンタイトルメントが表示され、これらのエンタイトルメントがプロファイルに適用されます。また、プロファイルに説明的な名前を付けても良いでしょう。タイトルに「development(開発)」という語句を含めると、作成中のプロファイルと区別することができます。

プロファイルが完成したら、作成したプロファイルを使用してDriverKitドライバーをテストすることができます。(テストを開始する前に、お使いのデバイスでSIPを再度有効にすることを忘れないようにしてください!)

[developer.apple.com](http://developer.apple.com/)からプロファイルをダウンロードし、XcodeでDriverKitのターゲットとしてプロファイルを選択します。また、コード署名IDを「Sign to Run Locally(署名してローカルで実行)」から証明書の1つに切り替えることもできます。これらの手順を完了すると、開発中のDriverKitドライバーは、エンタイトルメントが機能していて最新であることを確認するなど、システムによるコード署名チェックを受けます。

ドライバーを配布して公証する

DriverKitドライバーを世界に公開する準備ができたら、dextの識別子が必要になります。dextの識別子は開発時に作成したものと同じものを使用できますが、開発署名をオプトアウトした場合は、新しい識別子を作成する必要があります。新たに作成する必要がある場合は、前のセクションで説明した同様の手順に従ってください。


メモ:アプリケーションとドライバーには固有の識別子が必要です。製品版を作成するときに、同じ識別子やプロファイルを使用することはできません。


識別子を取得したら、ドライバーを含むmacOS App、およびDriverKit ドライバーの配信プロファイルを作成する必要があります。DriverKitドライバーは、Mac App Storeで直接配布することも、別の方法で配布することもできます。配信用のプロビジョニングプロファイルを作成する際、App Storeで配信する場合は「Mac App Store」を、独自で配布する場合は「Developer ID」を選択します。その後、識別子とターゲット証明書を選択し、ドライバーのプロファイルに「DriverKit Template Mac (Dist)」オプションを忘れずに追加してください。

識別とプロファイリングを行ったので、Xcode内でAppのリリースバージョンをビルドすることができます。

1. Xcodeのメニューから「Product(製品) → Archive(アーカイブ)」を選択します。 2.「Distribute App」を選択します。
3.公開する方式に応じて、「App Store Connect」または「Developer ID」のいずれかのフローに従って、必要に応じて新しく作成した配布用プロファイルを提供します。

リリース候補版のAppをビルドした後、Appを提出して公証を受けることで、適切に署名されたDriverKit ドライバーを配布することができるようになります。

Notarizing macOS software before distribution

Resources

DriverKit

カーネル拡張(kexts)からSystem Extensionに移行

View now