🦔

社内配布用のMacOS向けデスクトップアプリを公証する

2024/01/11に公開

はじめに

アイディオットDX開発部の中川です。
今までElectronなどで作られた野良アプリはユーザーの方でセキュリティリスクを負って
インストールする必要がありましたが、macOS Mojave以降ではAppleから公証(notarization)を得たアプリのみが
GateKeeperというチェック機構を通過して起動できるようになりました。

WWDC2021でnotarytoolが発表されてから、その手順が意外とまとまっていませんでした。
2023年11月1日以降はnotarytoolもしくはXcode14での公証明が必須となった今
手順をまとめていこうかと思います。

必要な準備: Apple Developerライセンス

これまでは作成したデスクトップアプリを身内で配布する際には、
.app拡張子の実行形式ファイルもしくは、そちらを内包したDiskImage(.dmg)を配布すれば良かったのですが
公証が必須になったことで、実質Apple Developerライセンスが必要となりました。
Appleさんへ感謝しつつ、年間ライセンス($99)を契約しましょう。

契約したら下記にアクセスの後、赤枠の証明書へと遷移しましょう。
https://developer.apple.com/

apple_developer_証明書

profile設定からmacOSのDeveloper IDを選択してプロファイルを作成しましょう。

notarytool_001

notarytool_002

設定が終わったら .provisionprofileファイルをダウンロードしたら
ダブルクリックしてインストールしてください。

notarytool_003

MacOSへプロファイルを登録

下記のコマンドでローカルのMacへと開発プロファイルを保存します。

# このコマンドの対話形式の最初に、プロファイル名を聞かれるのですが後の公証で使用するため覚えておきましょう...!
$ xcrun notarytool store-credentials --apple-id "<Apple IDのメールアドレス>" --team-id "<チームID>"

プロファイル名を入力したらAppパスワードが聞かれるのですが、
こちらはApple ID アカウント設定からあらかじめパスワードを作成する必要があります。
下記キャプチャの場所になりますので作成して、そのパスワードを使いましょう!

notarytool_004

entatlements.plistの準備

こちらはXcodeを使用する場合は、チェックをつけていくだけで生成されているのですが
サードパーティ製のフレームワークですと手動で用意する必要があります。
最低限のentitlements.plistの例を載せておきます。
こちらはアプリ内で必要な機能ごと(Apple PayやBLE機能など)に記載が必要になります。

<?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">
<!--
   entitlements.plist

   Created by <ユーザー名> on 2024/01/07.
   Copyright (c) 2024 <会社名など>. All rights reserved.
-->
<plist version="1.0">
  <dict>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
  </dict>
</plist>

keyに記載する項目は、特にHardened Runtimeというセキュリティ保護とリソースアクセスの項目が多いので
下記に項目の参考を載せておきます。

参考:Hardened Runtime

公証の前のコード署名

ここら辺が少しめんどくさいポイントなのですが、
ElectronやEel, Fletといった例えばPythonのフレームワークごとにコード署名の方法やツールは異なるのですが、
ファイルごと認証するにはcodesignコマンドを実行するのが確実です。

# 仮にtarget.appをコード署名する場合
# entitlements.plistの箇所も置いてあるパスを指定してください
$ codesign -f -s <チームID> -v --deep --timestamp --entitlements entitlements.plist -o runtime target.app

notarytoolでの公証

いよいよAppleへデスクトップアプリを提出して公証を得ていきます。
かつてはaltoolというコマンドがあったのですが、notarytoolへと移行が必要になりました。
--waitが追加され、公証が完了するまで接続したままでいられるのがとても便利になりましたね!

# 控えておいたプロファイルをここで使います。
$ xcrun notarytool submit <zipとdmg> --keychain-profile "<プロファイル>" --wait

公証には.appファイルや.pkgはそのまま提出することができません。
そのため対応形式であるzip, dmgに変換してから公証にアップロードする必要があります。
下記にzipにする方法、dmgにする方法も記載しておきます。

# zipにまとめる
$ ditto -c -k -rsrc --sequesterRsrc --keepParent target.app <zipのパス>

# dmgにまとめる
$ hdiutil create -volname <ボリューム名> -srcfolder target.app -ov -format UDZO <ディレクトリ>

xcrun stapler staple

こちら公証が終わったところで完了かと思いきや
オンライン時には先ほどの公証が問い合わせされるのですが、
オフライン時には証明書を同梱していないとチェックができないので
そのために下記を実行していきましょう。

$ xcrun stapler staple <zipとdmg>

最後に

新しいnotarytoolによるデスクトップアプリの公証手順でした。
意外と手順が多く、オンライン上に資料もまとまっていなかったため苦労した点もありましたが
社内でアプリ配布をする際の一助となりますと幸いです...!

あとがき

AI・データ利活用をリードし、世界にインパクトを与えるプロダクトを開発しませんか?

アイディオットでは、今後の事業拡大及びプロダクト開発を担っていただけるエンジニアチームの強化を行っております。
さらに会社の成長を加速させるため、フロントエンドエンジニア、バックエンドエンジニア、インフラエンジニアのメンバーを募集しております!
日本を代表する企業様へ自社プロダクトを活用した、新規事業コンサルティング、開発にご興味のある方はお気軽にご連絡ください。

【リクルートページ】
https://aidiot.jp/recruit/
【募集ポジション一覧】
https://open.talentio.com/r/1/c/aidiot/homes/3925
【採用についてのお問合せ先】
株式会社アイディオット 採用担当:大島
メールアドレス:recruit@aidiot.jp

Discussion