iOS17 Xcode15 xcframeworksでのSDKコード署名の仕組み

## デジタル署名検証
Xcodeによるデジタル署名検証は、アプリ開発者がアプリを保護し、依存関係のSDK作成者が配布するSDKを保護します。
SDKを開発する場合、誰もSDKを変更したり改ざんしたりできないようにする必要があります。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/7928b5ab-a3d7-4937-85ee-a52c1b865571.png)
コード署名の仕組みと、SDK開発者IDを使用してSDK内に署名がどのように含まれるかについて説明します。

## コード署名の仕組み：xcframeworkの作成
:::note warn
アプリで使用できる依存関係タイプは**xcframework**となります。
:::
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/3f73449f-3bd5-6001-3c1a-61d5f644047b.png)
コード署名は、以下を開発者のIDと暗号的にリンクするメカニズムです。
```
・最終的にコンパイルされたバイナリ
・フレームワークのInfo.plist
・プライバシー マニフェストなどの関連メタデータ
```
or
```
・特定の種類の配布の場合はソースコード自体
```

## コード署名の仕組み：CDハッシュ（xcframework）を作成
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/8aaf53c2-a80d-b815-f75b-889d069bc1db.png)
コード署名は、コンパイルされたバイナリのコードディレクトリハッシュ(CDHashとも呼ばれる)を最初に生成することによって機能します。

## SDK開発者IDを使用してSDK内に署名がどのように含まれるか
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/d8788814-d9b0-55cd-c397-fa123a3bf048.png)
このハッシュに署名するには、SDK開発者ID（開発者証明書 + 秘密キー＆公開キー）を使用します。
署名が特定の時点で生成されたことを検証するために使用される安全なタイムスタンプと組み合わせます。
xcframeworksでは、署名は **_CodeSignatureディレクトリ** 内にあります。

:::note info
これにより、SDKを改ざんすると署名は無効になります。
また、アプリ開発者は、署名に埋め込まれた証明書を使用して、署名したのがあなたであることを検証することもできます。
:::

## 署名ステータスは、Xcode15から確認できる
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/dfed0d69-b3b2-70b6-f59f-711222f7b479.png)
Xcodeでは、以下のアプリ内に含めたxcframeworksの署名ステータスを示します。
* **Apple Developer Program ID**によって署名されている（Apple Developer Program）
* **自己署名証明書**によって署名されている（Self Signed）
* 現在まったく署名されていない

さらに、Xcodeは、xcframeworkを初めて使用するときにIDを記録し、それが後のビルド中に変更されないことを確認します。

:::note info
**Apple Developer Program ID**の場合：
Appleは、使用されている証明書の有効性(失効しているかどうかなど)を確認し、複数の開発者が同じ名前で登録できないようにすることができます。
:::
:::note info
**自己署名証明書**の場合：
アプリ開発者はその有効性と信頼性を依存関係の作成者に直接確認する必要があります。
:::

## 署名証明書の有効期限切れ or 不正な場合は、Xcodeからアラート表示
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/7a919d64-2eda-41c1-a515-6e0dc38dfd1e.png)

**Apple Developer Program ID**の場合：
Xcodeはビルド時にそれを検証し、署名が有効でない場合、IDが変更された場合、または証明書の有効期限が切れた後にxcframeworkが署名された場合にアラートを表示します。
（*有効期限が切れると、Xcodeは新しい証明書が同じ開発者からのApple Developer Program IDであれば自動的に検証してくれます。:thumbsup_tone2:*）

**自己署名証明書**の場合：
Xcodeは証明書のSHA-256フィンガープリントを以前にプロジェクトに追加されたフィンガープリントと比較します。
IDが変更された場合、または依存関係の内容が変更された場合はアラートが表示されます。
その場合、xcframework作成者がこの情報をパブリックな場所でアナウンスするか、xcframework作成者に連絡して、フィンガープリントが使用したものと一致することを確認する。

:::note alert
Xcodeは、Apple Developer Program証明書がAppleによって悪意がある開発者アカウントに対して取り消された場合にもアラート表示します。
:::

## SDK（xcframeworks）に署名する方法

以下の通りXCFramework作成後に、```codesign```コマンドでXCFrameworkに署名する
```
echo "Build Archive Device Slice"
xcodebuild clean archive -sdk iphoneos -destination 'generic/platform=iOS'[...]
echo "Build Archive Simulator Slice"
xcodebuild clean archive -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' [...]
echo "Create XCFramework"
xcodebuild -create-xcframework [...] -output <YOUR.xcframework>
echo "Codesign XCFramework"
codesign --timestamp -v --sign "<YOUR CERTIFICATE (ABCXYZ)>" "<YOUR.xcframework>"
```

**Apple Developer Program ID**で、SDK（xcframeworks）に署名する```codesign```コマンド例
```
codesign --timestamp -v --sign "Apple Distribution: Truck to Table (UA527FUGW7)" BirdFeeder.xcframework
```

:::note info
**Apple Developer Programのメンバーでない場合**は、自己署名証明書を生成し、それを```codesign```コマンドで使用してxcframeworkが自分によって署名されたことを確認できるように、自己署名証明書のフィンガープリントをSDKクライアントと共有する責任があります。
これにより、アプリにSDKを組み込む開発者は、Xcodeに含まれる新機能を使用して、xcframeworkがあなたによって署名されたことを確認できます。
:::

## Apple解説動画
[デジタル署名を使用してアプリの依存関係を検証する](https://developer.apple.com/videos/play/wwdc2023/10061/)