Command Line ToolのApple公証を行う

# Command Line ToolのApple公証を行う

- XcodeでCommand line toolを作っている場合、`.app`と同じ様に`Organizer`から公証を行うことができません。
- `Terminal`からコマンドを叩く必要がありますが、必要な設定があり困りポイントが多かったので、そこ辺のTipsを共有します。

# 参考
- [Notarize a Command Line Tool](https://scriptingosx.com/2019/09/notarize-a-command-line-tool/)
    - 大筋この通りで問題ないと思います。
- [Resolving Common Notarization Issues](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#see-also)
    - 細かい設定の仕方もリファレンスをよく見れば載っていました。
- [manpagez: man pages & more
man codesign\(1\)](https://www.manpagez.com/man/1/codesign/)
- [codesign\(1\) についてのメモ](https://mtakagi.tumblr.com/cli/codesign.1/)
- [macOSアプリに埋め込む実行バイナリのNotarization/Hardened Runtime対応は署名すればOK](https://iseebi.hatenablog.com/entry/2019/07/25/005311)

# 実践
- 基本以下の通り行います。
    - [Notarize a Command Line Tool](https://scriptingosx.com/2019/09/notarize-a-command-line-tool/)

## Xcodeプロジェクトの設定
- 下2つが記事に載って無くて苦労したポイントなので共有します。

### Time Stamp
- `Terminal`からビルドする際はTime Stampが含まれないので、設定を行います。
- [Resolving Common Notarization Issues](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#see-also)
    - > In this case, be sure to add a secure timestamp by adding the --timestamp flag to your OTHER_CODE_SIGN_FLAGS build setting

![](https://i.imgur.com/IfCaGFa.jpg)


### Avoid the Get-Task-Allow Entitlement
- デバッグを行うためにセキュリティを緩めるフラグがデフォルトで立っています。
- `Terminal`からビルドする場合はこのフラグが削除されないので、予め設定からフラグを落としておく必要があります
- [Resolving Common Notarization Issues](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#see-also)
    - > set the CODE_SIGN_INJECT_BASE_ENTITLEMENTS build setting to NO before building your app for distribution

![-w1064](https://i.imgur.com/H4zykK2.jpg)


### 署名設定
- Auto Signingではなく、マニュアルで指定します。（Auto Signingだとうまく行かない？）
- `Developer ID Application`を選択します。
 
![-w846](https://i.imgur.com/ia11P21.jpg)

### hardened Runtimeを有効にする

![-w636](https://i.imgur.com/z35nDM3.jpg)


### ビルドの場所を変更する

![-w838](https://i.imgur.com/s3w3ceW.jpg)


## ターミナルでビルド

- 自分の場合クリーンがうまく行かなかったので`Derived Data`や`build`を手動で削除した。

```sh
xcodebuild clean install
```

- pkg作成

```sh
pkgbuild --root build/pkgroot \
           --identifier "com.example.hello" \
           --version "1.0" \
           --install-location "/" \
           --sign "Developer ID Application: xxx. (xxxxxxxxxx)" \
           build/hello-1.0.pkg
```

- Appleの公証

```sh    
xcrun altool --notarize-app \
             --primary-bundle-id "com.example.com" \
             --username "xxx@xxx.co.jp" \
             --password "@keychain:AC_PASSWORD" \
             --file "build/hello-1.0.pkg"
```

- 公証の状況確認（エラーが出たらここからログを確認できます）

```sh
xcrun altool --notarization-info "xxx-xxx-xxx-xxx-xxx" 
            -u "xxx@xxx.co.jp" 
            -p "@keychain:AC_PASSWORD"
```

# 再署名する際にHardened Runtime対応をする
- （今回は関係ないですが…）
- 再署名する際に通常だと、ビルド時に設定した`Hardened Runtime`がオフになるので、オプションで指定する必要があります
- [macOSアプリに埋め込む実行バイナリのNotarization/Hardened Runtime対応は署名すればOK](https://iseebi.hatenablog.com/entry/2019/07/25/005311)
    - > codesign コマンドに`--options runtime`をつけてバイナリを署名することで、Hardened Runtime対応となります。

```sh
sudo codesign --force --options runtime --deep-verify --verbose --sign "Developer ID Application: xxx. (xxxxxxxxxx)" path/to/app
```