Skip to content

Instantly share code, notes, and snippets.

@mrtry
Created January 19, 2022 09:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrtry/008215c67f97ea5022bbacdf7bde23b7 to your computer and use it in GitHub Desktop.
Save mrtry/008215c67f97ea5022bbacdf7bde23b7 to your computer and use it in GitHub Desktop.
リリース時までに知っておきたい署名まわりの話
marp paginate
true
true
<style> img[alt~="center"] { display: block; margin: 0 auto; } </style>

リリース時までに知っておきたい署名まわりの話

mrtry 2022/01/19


自己紹介

width:200

  • とらい(@mrtry)
  • Yamamoto Shinnosuke
  • 株式会社JMDC
  • Android / React Native
  • 最近放送大学で心理学系をお勉強してる

署名まわり、あたふたしがち

  • 対応を後回しにしがちで、ファーストリリース前に稀によくコケる
  • 運用フェーズになったら、そんなに触らないので忘れがち
  • 基礎的なところを完全に理解していきたい 💪💪💪

目次

  • 署名とは
  • Platformごとの署名方法
    • Androidの署名
    • iOSの署名
  • よくあるユースケースとその対応方法

署名とは?


署名とは?

  • 「秘密鍵を用いて、アプリにデジタル署名する」プロセスのこと
  • アプリの作者を保証し、改ざんやなりすまし防止のために行われる
  • 各Platformごとに署名の手続きをする必要がある

center


Platformごとの署名方法


Androidの署名


Androidの署名

  • Java Keystore を作成し、それを用いて署名を行う
  • Developerが署名する鍵は Upload Key と呼ばれている

center


Androidの署名

Java Keystore とは

  • 「秘密鍵」「公開鍵証明書」をセットにしたもの

center


Androidの署名

Java Keystore の作り方

center width:300


Androidの署名

Keystoreを用いて署名する

  • android/app/build.gradle にKeystoreの設定する
...
android {
    ...
    signingConfigs {
        release {
            storeFile file(MYAPP_UPLOAD_KEYSTORE_FILE)
            storePassword MYAPP_UPLOAD_STORE_PASSWORD
            keyAlias MYAPP_UPLOAD_KEY_ALIAS
            keyPassword MYAPP_UPLOAD_KEY_PASSWORD
        }
    }
}
...
  • $ cd android && ./gradlew bundleRelease で署名されたApp Bundleができる

Androidの署名

やることまとめ

  • Java Keystoreを作成する
  • android/app/build.gradle にKeystoreの設定する
  • Release buildをする

iOSの署名


iOSの署名

  • Provisioning Profile をPackagingする必要がある

center


iOSの署名

Provisioning Profile とは

  • 「App ID」「Device ID」「証明書」をまとめたもの
  • インストールや実行時に参照され、不正なアプリではないかをチェックしている

center


iOSの署名

証明書 の種類

  • Development
  • Production

Provisioning Profile の種類

  • AppStore
  • Adhoc
  • Development

今日はAppStoreから配信する際のパターンについて紹介します

  • Production の証明書 x AppStore の Provisioning Profile

iOSの署名

Provisioning Profile の作り方

  • App IDを登録する
  • Device IDを登録する
  • 証明書 (Production)

→ 作業や管理を簡略化するために fastlane を利用する


iOSの署名

fastlane とは


width:700 center


iOSの署名

App IDを登録する

$ fastlane produce --app_identifier [App ID] --company_name [company name]

[Option] Push通知などを利用している場合は、利用する機能を有効にしておく

$ fastlane produce enable_services [service name]

iOSの署名

[Option] Device IDを登録する

  • AppStoreに配信するだけならSkipして問題ない
  • 実機で動作確認する場合は、実機のUDIDをApple登録する必要がある
    • WhitelistとしてProvisioning Profileに保持される
    • AppStore用のProvisioning Profileでは、Apple側で再署名される
      • その際に、Device IDの項目がWhitelistがwildcardのようになってくれる
$ fastlane run register_device name:"[device name]" udid:"[udid]"

iOSの署名

証明書とProvisioning Profileを作成する

  • fastlane matchを利用する
    • 発行した証明書とProvisioning ProfileをRepository管理する仕組み

center width:700


iOSの署名

証明書とProvisioning Profileを作成する

  • Githubなどに管理用Repositoryつくる

iOSの署名

証明書とProvisioning Profileを作成する

  • パスワードの設定
    $ fastlane match change_password
    

iOSの署名

証明書とProvisioning Profileを作成する

  • 初期化する
    $ fastlane match nuke distribution --app_identifier [App ID]
    

iOSの署名

証明書とProvisioning Profileを作成する

  • AppStore用の証明書とProvisioning Profileを発行

  • 作成したRepositoryに保存

  • 実行環境に証明書インストール

    $ fastlane match appstore --app_identifier [App ID]
    
  • 他の開発環境で証明書とProvisioning Profileを取得する際には readonly をつける

    $ fastlane match appstore --app_identifier [App ID] --readonly
    

iOSの署名

Xcodeの設定を色々して、Release buildする

  • Automatically manage signing を外す
  • 作成したProvisioning Profileを選択する
  • Release buildする

center width:750


iOSの署名

やることまとめ

  • Provisioning Profileを作成する
    • App IDを登録する
    • Device IDを登録する
    • fastlane matchで証明書とProvisioning Profileを作成する
  • Xcodeで証明書とProvisioning Profileの設定をする
  • Release buildをする

iOSの署名

補足

  • Provisioning Profileは定期的に再発行イベントがある
    • 証明書の期限が切れたとき
      • Appleから発行された証明書は、有効期限が 1年 となってる
        • Androidのほうは 25年 なので、あんまり気にしなくていい
    • Push通知などのCapabilities追加したとき
      • Provisoning Profileに有効になっているCapabilitiesが書いてある
      • 機能追加したら更新する必要がある
    • 検証端末を増やしたとき
      • UDIDが登録されていない検証端末では、アプリが動作しない
      • 新しい検証端末のUDIDを登録してから、Provisioning Profileを再発行する

よくあるユースケースとその対応方法


Staging環境つくりたい


Staging環境つくりたい

Androidでやること


Staging環境つくりたい

iOSでやること

  • package nameを環境ごとに分ける
  • Staging用にProvisioning Profileを作る必要がある
    • 検証端末のDevice IDを登録する
      • 21枚目のスライド参照
    • App IDをwildcardで指定して登録する $ fastlane produce --app_indetifier [App ID].*
    • Provisionig Profileを作る $ fastlane match adhoc --app_identifier [App ID].*

CIでSignging済みのパッケージファイルをつくりたい


CIでSignging済みのパッケージファイルをつくりたい

  • 署名関連ファイルは基本リポジトリに含めないので、CIでビルドするときにそれらを取ってくる必要がある
    • Androidは、keystoreをbase64してCIの環境変数にいれる
    • iOSは、matchを利用して証明書をローカルにとってくる

各種設定ファイルとかをfastlane matchのように管理したい


各種設定ファイルとかをfastlane matchのように管理したい

  • 各種設定ファイル
    • keystore, google-services.json, sentry.properties, ...
  • 大きく2パターンあるのでお好みでどうぞ
    • 機密情報管理サービスを利用し、セットアップ時に設定ファイルを生成する
      • AWS Secret manager
      • GCP Secret Manager
      • Hashicorp Vault
    • 設定ファイルを暗号化し、git管理に含めてしまう
      • git-secret
      • git-cript
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment