macOS の App Notarization について

# はじめに

本内容は[App Notarizationについての公式のドキュメント](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution)を読んで理解した内容を日本語でまとめたものです。
公式ドキュメントの内容を全て網羅している訳ではないので公式ドキュメントの方も参照することをお勧めします。

# macOS の App Notarization について

## Appleが提唱するNotarizationとは

- AppPreviewではない

- ユーザにアプリに悪意のあるコンテンツが含まれていないことを知らせる仕組み

- Notaizationが得られればnotary serviceによりチケットが発行され、オンラインで共有される

- GeteKeeperはインストーラの実行時にチケットの有無を確認し、存在を確認できた場合、Appleにより公証されていることをダイアログでユーザに通知する


## Notarization を受けないとどうなるの？

[公式サイトの注意事項](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution)によると下記のように書いてある

> Beginning in macOS 10.14.5, all new or updated kernel extensions and all software from developers new to distributing with Developer ID must be notarized in order to run. In a future version of macOS, notarization will be required by default for all software.

- アプリについてはNotarizationが無くても、直ぐに動作しなくなるということはなさそう
　→ 10.14.5 beta3で確認したところ、Notarizationが無くても動作した

- 新しく作成またはアップデートするKernel extensionについては10.14.5よりNotarizationが無いと動作しなくなる
　→ 10.14.5 beta3で確認したところ、Notarizationが無いアプリをインストールしてKernel extensionが動くか確認したところ、これまで同様に動作した

[10.14.5のリリースノート](https://developer.apple.com/documentation/macos_release_notes/macos_mojave_10_14_5_beta_3_release_notes)でも2019年4月7日以降に署名されたKernel extensionについてはNotarizationが必須となると明言している。

> Kernel extensions signed after April 7th, 2019 must be notarized in order to load on macOS 10.14.5. (50016570)

- 一応、製品版の10.15でもCtrlを押しながらアプリを起動すれば、Notarizationが無いアプリでも起動することが出来る

（[Appleが2019/10/3に出したNews](https://developer.apple.com/news/?id=10032019a)によると、Catalinaでデフォルトでアプリを動作させるためにはNotarizationが必要、としているためこの機能は当面は維持されるように見える）

> In June, we announced that all Mac software distributed outside the Mac App Store must be notarized by Apple in order to run by default on macOS Catalina. Make sure to test all versions of your software on the macOS Catalina GM seed and submit it to Apple to be notarized.

## AppleがNotarization認可のための提出条件を一定期間緩和する

> As a reminder, Mac software distributed outside the Mac App Store must be notarized by Apple in order to run on macOS Catalina. To make this transition easier and to protect users on macOS Catalina who continue to use older versions of software, we’ve adjusted the notarization prerequisites until January 2020.

## Notarization を受けるための手順

新しくビルドするアプリとリリース済みアプリへの対応は若干異なります。

### 新しくビルドするアプリ

下記の要件を満たした上で、後述のリリース済みアプリの手順と同様にApple nortary serviceへバイナリをアップする。

- 配布する全てのバイナリに署名を付ける

- Hardened RuntimeのcapabilityをONにする
  ※Harended RuntimeとはSystem Integrity Protectionをアプリまで拡張しコードインジェクションなどを防いでくれる仕組み
  ※Plug-inがアプリのコードに依存している場合には必要に応じてExceptionを設定する必要がある

- 署名にはAppStore以外でアプリを配布するための「Developer ID」の証明書で署名を行う、AppStore用の証明書はNG

- 署名には必ずsecure timestampを付ける
  ※secure timestampが付いているかは codesign -dvv の実行結果にTimestamp=xxxという出力があるかで判断できる

- デバッガがアタッチできないようにするため、get-task-allow.entitlementを外す
  ※具体的にはプロジェクトオプションのBuild Settings > Code Signing Inject Base Entitlements をNOに設定する

- Deployment Targetは必ずmacOS10.9以上を指定する
  ※署名検証が動作するのは10.9以上のため

### リリース済みアプリ

リリース済みアプリについては下記の手順でNotarizationを受けられるが、アプリによってはNotarizationを受けたとしても上手く動作しない可能性もあるため注意が必要。

１. Xcode10をインストールする
  ※複数のバージョンのXcodeをインストールしている場合はxcode-selectでXcode10を設定しておく

２. 下記のコマンドを実行し、nortary serviceにファイルをアップロードする
  ※インストーラを含んだディスクイメージを指定した場合、インストーラ及びその中のアプリも含めてNotarizeしてくれる

``` bash
$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip
``` 

３. 成功すると、下記ような出力が返るのでRequestUUIDを控えておく

``` bash
altool[16765:378423] No errors uploading 'OvernightTextEditor_11.6.8.zip'.
RequestUUID = 2EFE2717-52EF-43A5-96DC-0797E4CA1041
```

４. 下記コマンドを実行し、配布バイナリにNotarizationチケットを結合する
  ※チケットを結合することでネットに繋がっていない環境下でバイナリが実行されてもGatekeeperが判断できるようになる
  ※zipの形態でNotarizeを受けた場合、zip内のバイナリはそれぞれ個々に結合作業を行い、再度zip化する必要がある

``` bash
$ xcrun stapler staple "Overnight TextEditor.app"
```