key.properties と upload-keystore.jksの違い
結論: 役割が全く違う!
upload-keystore.jks → 実際の「鍵」🔑
key.properties → 鍵の「使い方」が書いてある説明書📄
比喩で言うと:
upload-keystore.jks = 実際の鍵 🔑
↓
これがないとドアが開けられない!
誰にも見せちゃダメ!
key.properties = 鍵の使い方メモ 📝
↓
「この鍵は、どこにあって、
パスワードは何で、
誰の名前で登録してある」
という情報
それぞれの中身
upload-keystore.jks – 実際の鍵
中身:
バイナリファイル(開けない!)
暗号化されたデータの塊
内容:
- 秘密鍵(Private Key)
- 公開鍵(Public Key)
- 証明書(Certificate)
開こうとすると:
���@��}�X��▒▒▒��… (文字化け)
Androidアプリに署名するための鍵
このアプリは私が作った本物ですという証明
key.properties – 鍵の使い方
中身:
storePassword=your_store_password
keyPassword=your_key_password
keyAlias=upload
storeFile=upload-keystore.jks
これは何?
ビルドするときに、どの鍵をどう使うかを教えるファイル
パスワードや鍵の場所を書いておく(金庫のパスワードをメモした紙)
図解: 2つの関係
storeFile=upload-keystore.jks・・・・
(パスワードを使って)
「これは 私 が作った本物」
ファイルの推奨される場所は
your_app/
├─ android/
│ ├─ key.properties ← ここ! ⭐
│ └─ app/
│ ├─ upload-keystore.jks ← ここ! ⭐
│ └─ build.gradle.kts
├─ lib/
└─ pubspec.yaml
なぜこの場所?
key.properties → android/ 直下
理由:
build.gradle.kts から読み込みやすい
Android プロジェクトのルートに置くのが慣例
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
// ↑ android/ からの相対パス
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
upload-keystore.jks → android/app/ 直下
理由:
アプリ固有のファイルだから app/ の中
key.properties からの相対パスが簡単
key.properties での指定:
storeFile=upload-keystore.jks
# または
storeFile=app/upload-keystore.jks
```
絶対に守るべきこと: .gitignore*
この2つのファイルは Git に入れちゃダメ! 🚫
なぜ?
“`
upload-keystore.jks → 鍵そのもの! 🔑
key.properties → パスワードが書いてある! 🔐
もし GitHub に上げたら…
→ 誰でもあなたのアプリに署名できる!
→ 偽アプリを作られる!
→ 超危険! ⚠️⚠️⚠️
.gitignore に追加(必須!)
# android/.gitignore または プロジェクトルートの .gitignore
# 鍵ファイル
**/android/app/upload-keystore.jks
**/android/key.properties
# または、より厳しく
*.jks
*.keystore
key.properties
確認方法:
git status
# これらが表示されたらダメ!
# modified: android/key.properties
# modified: android/app/upload-keystore.jks
# 表示されなければOK!
疑問をまとめ見た
key.properties のパスワードを変えたい
key.properties を編集するだけ!
変更前:
storePassword=old_password
変更後:
storePassword=new_password
別の場所に jks を置きたい
可能! key.properties でパスを指定:
# 絶対パス
storeFile=/Users/webtec/my-keys/upload-keystore.jks
# または相対パス
storeFile=../../../my-keys/upload-keystore.jks
複数のアプリで同じ鍵は使える?
使わない方が良い!
アプリごとに別の鍵が推奨
鍵が漏れたら全アプリが危険
your_keys/
├─ abc_app_keystore.jks
├─ zzzzz_manager_keystore.jks
├─ xxxx_keystore.jks
└─ ...
jks ファイルを失くしたら?
超大変!
- アプリの更新ができない
- 同じパッケージ名で新規登録もできない
対策:
✅ バックアップを複数箇所に
✅ クラウドストレージ(暗号化して)
✅ USB メモリ
✅ 紙にパスワードを書いて金庫へ
パスワードを忘れたら?
超大変!
復元不可能!
対策:
✅ パスワードマネージャーに保存
✅ 紙にメモして金庫へ
✅ key.properties をバックアップ(暗号化して)
セキュリティのベストプラクティス
1)DropBoxなどにバックアップ
2)パスワードマネージャーに保存
1Password, Bitwarden などに:
タイトル: Tuition App – Android Keystore
ユーザー名: upload
パスワード: xyz789
ストアパスワード: abc123
添付ファイル: upload-keystore.jks
3)GitHub には絶対に上げない
# .gitignore を確認
cat .gitignore | grep -E "(jks|keystore|key.properties)"
# 結果:
**/android/app/upload-keystore.jks
**/android/key.properties
4)環境変数を使う
# key.properties の代わりに環境変数
export KEYSTORE_PASSWORD="abc123"
export KEY_PASSWORD="xyz789"
export KEY_ALIAS="upload"
export KEYSTORE_FILE="upload-keystore.jks"
kotlin
// build.gradle.ktssigningConfigs {
release {
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
storeFile file(System.getenv("KEYSTORE_FILE"))
storePassword System.getenv("KEYSTORE_PASSWORD")
}
}
📊 まとめ: 2つのファイルの違い
| ファイル | 役割 | 置き場所 | 内容 |
|---|---|---|---|
| upload-keystore.jks | 実際の鍵 🔑 | android/app/ | バイナリ(暗号化) |
| key.properties | 設定ファイル 📝 | android/ | パスワード・パス |
重要ポイント:
✅ jks = 鍵そのもの(絶対に失くさない!)
✅ key.properties = 鍵の使い方(パスワードが書いてある)
✅ 両方とも .gitignore に追加!
✅ バックアップ必須!
比喩まとめ:
“`
🔑 upload-keystore.jks = 家の鍵(実物)
📝 key.properties = 「鍵はここ、パスワードはこれ」というメモ
🏠 build.gradle.kts = 「メモを見て、鍵を使って家を開ける」人
一言まとめ:
upload-keystore.jksは実際の鍵🔑(バイナリファイル)、
key.propertiesは鍵の使い方📝(パスワードとパス)。
置き場所はandroid/app/とandroid/。
両方とも.gitignoreに追加必須!
失くしたらアプリ更新不可能なのでバックアップ超重要! 🔐✨
