【Android】Google Play App Signingのススメ

Google I/O 2017で発表されたGoogle Play App Signingの紹介です。

## Google Play App Signing とは
Google Playに鍵をアップロードすることで、アプリリリース時にアップロードするAPKに対してGoogle Playにアップロードした鍵を利用してAPKに再署名し、ユーザーに配信することができる機能です。

![](https://qiita-image-store.s3.amazonaws.com/0/123122/3c3de695-50a7-138a-2730-b51a8fb187a6.png)

## 既存の方法
![](https://qiita-image-store.s3.amazonaws.com/0/123122/d2d04da7-9115-11d5-84c3-c9eccb374fa3.png)

既存の方法（Google Play App Signingを使わない方法）だと以下のようなリスクがあります。

- リリース用の鍵を紛失した場合、アプリのアップデートができなくなる。（新しいアプリとして新しいパッケージ名で公開する必要がある）
- リリース用の鍵を盗難された場合、他人が偽物のアプリを作れるようになってしまう。

Google Play App Signingを利用することで、これらのリスクを軽減することができます。

## Google Play App Signingの使い方

### 新規アプリの場合

新規アプリの場合は簡単で、Google Play Consoleの「アプリのリリース」を開いて「次へ」を押すだけです。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/80f82a95-cde8-b146-a9cf-ab203dd8ee26.png)

「次へ」を押下すると即座に有効化されます。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/dba342a8-16b5-8038-e01e-a46d89c62954.png)

他アプリで使っている署名鍵の再利用をすることもできます。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/69b6ad5e-0748-ed7e-14da-a030042ebce1.png)


### 既存アプリの場合
#### 1. Google Play Consoleのアプリの署名を開く
Google Play Consoleの左カラムの「リリース管理」の「アプリの署名」を開きます。

ちなみに「リリース管理」の「アプリのリリース」にも以下のような表示があるので「使ってみる」を押すと「アプリの署名」のページに遷移します。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/d815242b-0b57-810f-405c-bfe0b7557308.png)

#### 2. 秘密鍵のエクスポートと暗号化
PEPKツールをダウンロードするボタンがあるのでダウンロードして秘密鍵のエクスポートと暗号化を行います。
![Screen Shot 2017-08-18 at 22.26.49.png](https://qiita-image-store.s3.amazonaws.com/0/123122/bbef3c06-d344-7e6c-03b6-a4ff9647072c.png)

（PEPK ツール: PEPK（Play Encrypt Private Key）は、Google Play アプリ署名への登録手続きの際に、秘密鍵を Java Keystore からエクスポートし、Google Play への送信前に暗号化するツールです。）

PEPKツールをダウンロードしたら実行します。

```shell-session
$ java -jar pepk.jar --keystore=foo.keystore --alias=foo --output=encrypted_private_key_path --encryptionkey=*****
Enter store password:
Enter key password:
```

オプション説明
- keystore: 秘密鍵のファイル名を指定します。
- alias: 秘密鍵のエイリアスを指定します。
- output: 暗号化されたアプリ署名の出力先を指定します。
- encryptionkey: 暗号化キーです。（これはGoogle Play Consoleに記載されているものをそのまま指定します）

もしaliasが分からない場合はAndroid StudioのメニューからBuild > Generate Signed APKを選択して確認できます。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/205e9d03-1e9e-c478-9268-e0966df80f5d.png)

#### 3. 暗号化されたアプリ署名の秘密鍵をアップロード
アップロードボタンがあるので前の手順で作成した暗号化されたアプリ署名の秘密鍵をアップロードします。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/fc5a9425-11c0-7e71-8778-f31cbbb10a9d.png)

#### 4. アップロード鍵の生成
新しくアップロード鍵を生成します。
詳しくは「[アプリの署名 | Android Studio](https://developer.android.com/studio/publish/app-signing.html?hl=ja#sign-apk)」の「キーとキーストアを生成する」の項目を参照してください。

#### 5. アップロード鍵の証明書をPEM形式でエクスポート

```shell-session
$ keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem
Enter keystore password:
Certificate stored in file <upload_certificate.pem>
```

オプション説明
- keystore: アップロード鍵のファイル名を指定します。
- alias: アップロード鍵のエイリアスを指定します。
- file: アップロード鍵の証明書の出力先を指定します。


#### 6. アップロード鍵の証明書をアップロード
アップロードホタンがあるので前の手順で作成したアップロード鍵の証明書をアップロードします。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/3796602a-47bd-f8cd-60b6-fb68f7dcc0cd.png)

アップロード後に登録ボタンを押下します。

登録後に以下の表示が出ていればOKです。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/657a6aa0-94df-fd8e-904f-e4ba69570e98.png)

これらの操作を行ってGoogle Play App Signingを有効化してからは今まで使っていた秘密鍵ではなくアップロード鍵で署名する必要があります。

## 注意点
- アプリ署名のオプトイン（Google Play App Signingの利用）は取り消しできません。
- アップロード鍵を紛失して再度登録（変更）したい場合はGoogleに連絡する必要があります。


## 参考
アプリの署名 | Android Studio
https://developer.android.com/studio/publish/app-signing.html?hl=ja

アプリ署名鍵を管理する - Play Console ヘルプ
https://support.google.com/googleplay/android-developer/answer/7384423

Securing and Optimizing Your App with Google Play App Signing (Google I/O '17) - YouTube
https://www.youtube.com/watch?v=5tdGAP927dk