Android Certificate
Overview
Google Play Consoleの証明書関連をまとめたセクション。
Androidのコード署名
Androidでは秘密鍵と公開鍵証明書を格納したキーストアというファイルを使用する。
iOSと同様に、Androidも証明書をクラウドで管理するしくみがあり、Google Play Consoleではこの方法を推奨している。
「1」で開発者が作成したキーストアの秘密鍵はアップロード鍵と呼ぶ。
「5」でGoogle Play Consoleが生成・管理するキーストアの秘密鍵はアプリ署名鍵
手順は以下のとおり。
- 開発者がキーストアを作成する(アップロード鍵)
- 開発者が 1 のキーストアを使い、アプリに署名をする
- 署名済みの 2 のアプリをGoogle Play Consoleにアップロードする
- Google Play Consoleがアプリの署名を検証する
- Google Play Consoleが生成・管理するキーストアでアプリを再署名する(アプリ署名鍵)
- 再署名済みのアプリをGoogle Play Storeに配布する
署名はアップデートの際に「同じ署名がされているか」で正当性を確認する重要なステップ。
もし**署名に使う証明書(秘密鍵)**を紛失すると、アプリの更新ができなくなるというリスクがある。
そこでGoogle Play Consoleは以下のようにリスクを軽減している。
- 開発者が アップロード鍵(自分で管理する鍵)を使ってアプリを署名してアップロードする。
- アップロード後は、Google Play Consoleが アプリ署名鍵(Google側が管理する鍵)を使って再署名し、Google Play Storeで配布する。
- これにより、アプリ署名鍵(最も大事な鍵)はGoogle側がクラウドで管理してくれるので、開発者が鍵を紛失しても、アプリ更新が止まるリスクを避けられる。
アップロード鍵は開発者のローカル環境(個人の管理)で作成されるもの。
つまり 「アップロード鍵を管理する責任は開発者にある」 という意味。
ただしこのアップロード鍵は 「アプリ署名鍵」ではなく、Googleに渡す前の仮の署名に使うだけ。
そのため仮にアップロード鍵を失っても、新しいアップロード鍵をGoogleに登録してもらえれば復旧可能です(サポートが必要)
最終的な アプリ署名鍵はGoogle側でクラウド管理されている ので、最悪のリスク(アプリ更新が止まるリスク)は防げる仕組み。
- アップロード鍵:個人で管理するもの → 紛失したら手間はかかるけど、最悪リカバリ可能
- アプリ署名鍵:Googleがクラウドで管理 → 紛失リスクゼロで安心
Androidはアプリをアップデート(新しいバージョンのアプリを上書きインストール)する際に、同じ証明書で署名されている必要がある。
証明書を紛失してしまうと、アプリのアップデートができなくなってしまう。
そのため、ユーザーの手もとで検証される証明書をGoogle Play Consoleがクラウド上で管理することで、リスクを軽減している。
手順が非常に多いが、実際にはAndroid StudioのGUIを使って簡単に行うことができる。
keystore(キーストア)
アプリに署名して Google Play でリリースする(リファレンス)
keystore ファイルは Java のキーストア形式(.jks など)で保存される「バイナリ形式のファイル」
keystoreファイルはバイナリ
keystore.jks や keystore.p12 は中身が暗号化・署名されていて、テキストエディタで開くと文字化けする。
秘密鍵や証明書などのセキュアな情報を格納しているため、バイナリで安全に保存される。
key.propertiesファイル
key.propertiesは、Androidアプリのビルドに使われる署名鍵(keystore)情報を外部化して管理するための設定ファイル。
AndroidアプリをGoogle Playなどにリリースする際には、アプリに署名を行う必要があり、その署名情報(キーストアの場所やパスワードなど)をこのkey.propertiesに記述する。
ファイルの中身
key.propertiesファイルの中身は以下のようなキーと値のペアです。
storePassword=<keystoreのパスワード>
keyPassword=<鍵のパスワード>
keyAlias=key
storeFile=key.jks
各項目の意味
- storePassword: keystoreファイルのパスワード(作成時に設定)
- keyPassword: 鍵のパスワード(作成時に設定)
- keyAlias: keystore内で使うエイリアス名(通常は key など)
- storeFile: keystoreファイル名(例:key.jks)
📝 どこに置くの?
androidディレクトリ配下に置くのが一般的です。
android/
├── app/
├── build.gradle
├── key.properties ← ココ!
├── ...
🔐 セキュリティの注意点
- key.propertiesは**Gitなどのバージョン管理から除外(.gitignoreなどに設定)**するのが重要です。
- 実際のプロジェクトではkey.propertiesの内容をGitHubなどの公開リポジトリに絶対にコミットしないようにしましょう。
いえ、Android Studioを使わなくても大丈夫です!コマンドラインでも完全に対応できます。
Google Cloud Certificate Manager
Google Cloud Certificate Manager は、Google Cloud 上で TLS/SSL 証明書をセキュアかつ効率的に管理・運用できるマネージドサービス。
主な機能は以下の通りです:
- 証明書の自動プロビジョニング
- Let's Encrypt による無料証明書の自動取得・更新に対応
- カスタム証明書のアップロード
- 独自CAで発行した証明書もアップロード可能
- Google Cloud Load Balancer と統合
- HTTPS トラフィックに対する証明書適用が簡単
- 証明書のバージョン管理とローテーション
- 更新管理も自動化可能
- IAMベースのアクセス制御
- 証明書リソースごとにきめ細かくアクセス制御できる
Webアプリケーションや API の公開において HTTPS 対応が必須となる中で、Certificate Manager は運用負荷を最小限に抑えながらセキュアな証明書管理を実現する。
Android Studioを使わない方法
1. キーストア作成(コマンドライン)
住所入力などは適当な感じで良い。
個人の場合はPersonal等の入力で良いとのこと。
keytool -genkey -v -keystore upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
# javaがない場合は以下コマンドで作成できる
/Applications/Android\ Studio.app/Contents/jbr/Contents/Home/bin/keytool -genkey -v -keystore upload-keystore.jks -keyalg RSA -keys
ize 2048 -validity 10000 -alias upload
2. Gradle設定での署名(推奨)
key.propertiesファイルで設定build.gradleで署名設定を追加flutter build appbundle --releaseで署名済みAAB生成
3. 手動署名(jarsignerコマンド)
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore upload-keystore.jks app-release.aab upload
Android Studioの利点と代替手段
Android Studioの利点
- ✅ GUIで簡単操作
- ✅ 設定ミスが少ない
- ✅ 初心者に優しい
コマンドラインの利点
- ✅ CI/CDで自動化可能
- ✅ スクリプト化できる
- ✅ 軽量(Android Studio不要)
- ✅ Flutterプロジェクトとの親和性が高い
推奨アプローチ
Gradle設定による自動署名が最も実用的です:
- キーストア作成(1回のみ)
key.propertiesとbuild.gradle設定flutter build appbundle --releaseで署名済みAAB生成
この方法なら:
- Android Studio不要
- CI/CDでも使える
- チーム開発に適している
- Flutterの標準的な方法
コマンドラインでの設定方法で進めますか?「toggle to Act mode」で実際の作業を開始できます。
なるほど!既存のactionファイルがあるんですね。
Android署名関連の環境変数が必要な理由を説明します:
なぜAndroid署名関連の環境変数が必要?
CI/CD環境での署名の流れ
- GitHub Actions環境では
client/android/key.propertiesファイルが存在しない - キーストアファイルもローカルにしか存在しない
- CI/CDで署名済みAABを生成するには、これらの情報を環境変数で渡す必要がある
現在のローカル設定
client/android/key.properties:
storePassword=LohGhahohquai1ia
keyPassword=LohGhahohquai1ia
keyAlias=upload
storeFile=../upload-keystore.jks
CI/CD環境での対応
- キーストアファイル → Base64エンコードしてGitHub Secretsに保存
- key.propertiesの内容 → 各項目を個別の環境変数として設定
必要な環境変数まとめ
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON- Google Play Console API用ANDROID_KEYSTORE- 署名用キーストアANDROID_KEYSTORE_PASSWORD- キーストアパスワードANDROID_KEY_ALIAS- キーエイリアスANDROID_KEY_PASSWORD- キーパスワード
既存のactionファイルの内容を確認して、どのような設定になっているか見てみる。