デジタル署名検証
Xcodeによるデジタル署名検証は、アプリ開発者がアプリを保護し、依存関係のSDK作成者が配布するSDKを保護します。
SDKを開発する場合、誰もSDKを変更したり改ざんしたりできないようにする必要があります。
コード署名の仕組みと、SDK開発者IDを使用してSDK内に署名がどのように含まれるかについて説明します。
コード署名の仕組み:xcframeworkの作成
アプリで使用できる依存関係タイプはxcframeworkとなります。
コード署名は、以下を開発者のIDと暗号的にリンクするメカニズムです。
・最終的にコンパイルされたバイナリ
・フレームワークのInfo.plist
・プライバシー マニフェストなどの関連メタデータ
or
・特定の種類の配布の場合はソースコード自体
コード署名の仕組み:CDハッシュ(xcframework)を作成
コード署名は、コンパイルされたバイナリのコードディレクトリハッシュ(CDHashとも呼ばれる)を最初に生成することによって機能します。
SDK開発者IDを使用してSDK内に署名がどのように含まれるか
このハッシュに署名するには、SDK開発者ID(開発者証明書 + 秘密キー&公開キー)を使用します。
署名が特定の時点で生成されたことを検証するために使用される安全なタイムスタンプと組み合わせます。
xcframeworksでは、署名は _CodeSignatureディレクトリ 内にあります。
これにより、SDKを改ざんすると署名は無効になります。
また、アプリ開発者は、署名に埋め込まれた証明書を使用して、署名したのがあなたであることを検証することもできます。
署名ステータスは、Xcode15から確認できる
Xcodeでは、以下のアプリ内に含めたxcframeworksの署名ステータスを示します。
- Apple Developer Program IDによって署名されている(Apple Developer Program)
- 自己署名証明書によって署名されている(Self Signed)
- 現在まったく署名されていない
さらに、Xcodeは、xcframeworkを初めて使用するときにIDを記録し、それが後のビルド中に変更されないことを確認します。
Apple Developer Program IDの場合:
Appleは、使用されている証明書の有効性(失効しているかどうかなど)を確認し、複数の開発者が同じ名前で登録できないようにすることができます。
自己署名証明書の場合:
アプリ開発者はその有効性と信頼性を依存関係の作成者に直接確認する必要があります。
署名証明書の有効期限切れ or 不正な場合は、Xcodeからアラート表示
Apple Developer Program IDの場合:
Xcodeはビルド時にそれを検証し、署名が有効でない場合、IDが変更された場合、または証明書の有効期限が切れた後にxcframeworkが署名された場合にアラートを表示します。
(有効期限が切れると、Xcodeは新しい証明書が同じ開発者からのApple Developer Program IDであれば自動的に検証してくれます。)
自己署名証明書の場合:
Xcodeは証明書のSHA-256フィンガープリントを以前にプロジェクトに追加されたフィンガープリントと比較します。
IDが変更された場合、または依存関係の内容が変更された場合はアラートが表示されます。
その場合、xcframework作成者がこの情報をパブリックな場所でアナウンスするか、xcframework作成者に連絡して、フィンガープリントが使用したものと一致することを確認する。
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
Apple Developer Programのメンバーでない場合は、自己署名証明書を生成し、それをcodesign
コマンドで使用してxcframeworkが自分によって署名されたことを確認できるように、自己署名証明書のフィンガープリントをSDKクライアントと共有する責任があります。
これにより、アプリにSDKを組み込む開発者は、Xcodeに含まれる新機能を使用して、xcframeworkがあなたによって署名されたことを確認できます。