個人的にメンテしているHHKPS2USBDriverというカーネル拡張を、Apple Notary Serviceから証明してもらえることができたので記録に残します。
どんな拡張なのか
古いPS/2接続のHappy Hacking Keyboardは、PS/2をUSBに変換するコンバータを使ってmacOSに接続するとCommandキーを正しく入力することができません。この拡張はコンバータ経由でもCommandキーを扱えるようにキーコードを置き換えます。オリジナル版はNAKANISHI Ichiroさんによって作成されましたが、Yosemite以降はコード署名が必須となり使えなくなっていたので、許可を頂いてメンテと公開を行なっています。
Apple Notary Serviceにアップロードする
macOS 10.14.5から、Notary Serviceで署名することが基本的に必須となりました。これはカーネル拡張も例外ではないので、HHKPS2USBDriverも対応が必要となりました。Apple公式のドキュメントには、Notary Serviceで署名するためにはXcodeからアップロードするように書かれていますが、カーネル拡張プロジェクトの成果物はGeneric Xcode Archiveと呼ばれる形式になるようで、この形式ではXcodeに Distribute Appオプションが現れないためアップロードすることができません。
Generic Xcode Archiveが作成されてしまう原因は、アプリのArchiveでipaが作れなくて焦ったメモによると、
- Build SettingsのSkip InstallがNO
- Build PhasesにHeadersがある
のうち片方でも該当すると対象になるようですが、カーネル拡張の場合は上記のパラメータを設定してもGeneric Xcode Archiveから変わりませんでした。
コマンドラインからアップロードする
Generic Xcode Archiveの場合でも、コマンドラインならApple Notary Serviceにアップロード可能です。公式のドキュメントは以下にありました。
- Notarizing Your App Before Distribution | Apple Developer Documentation
- Customizing the Notarization Workflow | Apple Developer Documentation
ドキュメントを読めば書いていますが、少し悩んだところがあったので今回の手順をまとめておきます。
- Xcodeでアーカイブを作成して署名する
- OrganizerからDistribute Contentを押してモーダルを開き、Built Productsでカーネル拡張(以下ではHHKPS2USBDriver.kext)を書き出す
ditto -c -k --keepParent HHKPS2USBDriver.kext HHKPS2USBDriver.zip
を実行- Apple IDサイトにログインしてアプリ用パスワードを生成する
xcrun altool --notarize-app --primary-bundle-id org.lufia.driver.HHKPS2USBDriver --username '<user@icloud.com>' --password '<passpass>' --file HHKPS2USBDriver.zip
でアップロード- 終わるまで待つ(10分程度必要でした)
手順4のアプリ用パスワードは、Using app-specific passwords - Apple Supportに作成手順が書かれていますが、Apple IDにログインして、セキュリティのパスワードを生成を押せばすぐに作成できます。
また、最後のxcrun altool
は、公式のドキュメントでは@keychain:AC_PASSWORD
のようにKeychainのエントリからパスワードを取得していますが、パスワードを直接指定することもできます。今回はローカル環境で実行したため直接書けば問題ありませんでした。ただし、CI環境など不特定多数がログインする環境ならKeychainを使う方がいいでしょう。
上記の手順を終えると、
2019-06-05 13:57:06.788 altool[10401:14566062] No errors uploading 'HHKPS2USBDriver.zip'. RequestUUID = d4db7a94-02b8-4ce9-821b-c4f49d8ba7e5
のようなテキストが出力され、Apple IDに設定しているメールアドレスへメールが届きます。これでプロセスは終わりです。
参考情報
カーネル拡張ではないですが、前職の同僚もNotary Serviceのエントリを書いていました。
- Visual Studio App CenterでmacOSアプリのNotarizationに対応しようとした - backyard of 伊勢的新常識
- macOSアプリに埋め込む実行バイナリのNotarization/Hardened Runtime対応は署名すればOK - backyard of 伊勢的新常識
また、カーネル拡張を開発する時に調べたリンクや自分で過去に書いた記事などです。
- Driverについて
- OSX: Info.plist Properties for Kernel Extensions
- OS X の Kernel Extension に署名する (フェンリル | デベロッパーズブログ)
Info.plistのOSBundleLibrariesは、ビルドしたカーネル拡張をkextlibsで調べると分かります。
$ kextlibs -xml HHKPS2USBDriver