この度個人開発アプリTwitMorseのヘルプ画面にAdmob広告を追加した

【Android開発】staging用にstorePasswordなどをセキュアに保つ方法

Androidアプリ開発に限らずなのですが、ステージング環境といって、本番環境に限りなく近いテストアプリ(またはAPI)を作ることが仕事上あると思います。

個人で開発しているような小さなアプリであれば、そんなに「デバッグ版」「ステージング版」「リリース版」と分ける必要もないかも知れませんが、この度、私が趣味と勉強のために開発・運用し続けているモールス信号が呟けるTwitterクライアント「TwitMorse」にバナー広告(Admob広告)を出してみる、という課題にチャレンジした際、debug版とrelease版を分ける必要が出てきてしまいました。そして、本番広告をテストするためにもstaging版も準備する必要がありました。



Androidアプリリリースに必要なkeystoreファイル

こいつは初リリース時に作り、厳重に保管する必要があります。
リリース用のapkファイルを作る際に、Googleに「私が責任を持ってこのアプリを作りました」と証明するための秘密鍵です。

以前、ホーホケキョ! 気まずい沈黙を打ち破れ!の最初のリリースをした時に、このkeystoreファイルを紛失していてしかたなしに別のアプリとしてhohokekyoを作った記憶があります。その時の記事もあります。

くわしくは下記を参照ください。

紛失するとまた別アプリとしてリリースが必要になります。なので絶対に紛失しないよう大事にしてください。
最近だと{アプリ名}.keystoreではなく{アプリ名}.jksになっているかも知れません。

まあ署名ファイルについての扱いは検索してみてください。

本番テストをするため、staging用ビルドバリアントを設定する

build.gradle

android {
    ...
    defaultConfig {...}
    signingConfigs { #今回追加分 アプリの署名設定
        release {
            storeFile file("myreleasekey.keystore")
            storePassword "password"
            keyAlias "MyReleaseKey"
            keyPassword "password"
        }
    }

    buildTypes {
        debug {
        ...
        }
        staging { #今回追加したstaging用ビルドバリアント
            ...
            signingConfig signingConfigs.release
        }
        release {
            ...
        }
    }
}

これは例ですが、storePasswordとkeyPasswordがbuild.gradleに丸裸で存在することになってしまいます。
ステージング環境用のapkとはいえ、デコンパイルされてしまえば悪用されるリスクを伴います。
命綱となるパスワード類はセキュアにした方が無難です。

storePasswordとkeyPasswordをセキュアにする

そこで、自分の開発機に環境変数としてパスワード類を管理する方法があります。
開発機がMac,Linuxであれば(多分、、、Windows10でもいけるはず)

~/.bash_profile(~/.bashrcでも良いです)

# for TwitMorse (Android App)
export KSTOREPWD=EXaMple
export KEYPWD=EXaMplE

という記述を加え、

$ source ~/.bash_profile #またはsource ~/.bashrc

環境変数をターミナルなどでsourceコマンドで読み込んでおきます。
その後、sigingConfigs.releaseの中身を下記のように書き換えます。

build.gradle

    signingConfigs {
        release {
            storeFile file("~/path/to/myreleasekey.keystore")
            storePassword System.getenv("KSTOREPWD")
            keyAlias "MyReleaseKey"
            keyPassword System.getenv("KEYPWD")
        }
    }

ポイントは、

System.getenv("KSTOREPWD")

で、GroovyのSystem.getenvを使って開発しているPCの環境変数からパスワードを取得し、ビルドします。
こうすればデコンパイルされてbuild.gradleの中身を覗かれても、開発に使った端末以外からはパスワードを知ることはできません。
これにてビルドバリアント(Android Studio上ではBuild Variants)にstagingビルド設定が追加され、本番の広告バナーをテストすることができます。(ただし、テストだからといって叩きすぎるとGoogleさんに怒られてアカウントバンされますのでご注意を)

AndroidStudioにおけるビルドバリアントの場所

更に更に、ビルドする時にパスワード入力を求めるようにするという、ハイパーセキュアなパスワード忘れたら終わりの方法が、Android Developer公式サイトで紹介されています。

storePasswordとkeyPasswordをビルドプロセスの途中でコマンドライン入力させる方法です。

storePassword System.console().readLine("\nKeystore password: ")
keyPassword System.console().readLine("\nKey password: ")

ただパスワードってある程度法則性をもたせたりしても忘れたりするから、やっぱりSystem.getenvを使う方法のほうが個人開発アプリでは無難かもしれません。

個人的な疑問:keystoreファイルをどう管理するか

個人的な疑問としてはkeystoreファイルの管理方法ってみんなどうしてるんだろう?

ってことです。自分の場合は、まあ個人の趣味のアプリ開発なので適当にDropboxを使ったりしていますが・・・

そもそもプロジェクトファイルに含めてgit管理していいものなのか・・・?
上記で挙げたbuild.gradleの事例でもそのへんはうやむやにしています。
皆さん、現場ではどうなっているんでしょうか?個人的に気になっているところです。


参考資料

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください