Xamarin.Forms+ReactivePropertyでスマホアプリ開発！《リリース・署名編》

【記事ツリー】

- [スマホアプリ開発！《本編》](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)
 - [スマホアプリ開発！《MasterDetailPage編》](https://qiita.com/YSRKEN/items/521d2962ac664fa95ebe)
 - [スマホアプリ開発！《ReactiveProperty編》](https://qiita.com/YSRKEN/items/d6835ac9f1338eeaab05)
 - [スマホアプリ開発！《ファイル読み込み編》](https://qiita.com/YSRKEN/items/36fb3b4ae0c0cf7476db)
 - [スマホアプリ開発！《リリース・署名編》](https://qiita.com/YSRKEN/items/cf22da85013197949742)

# 概要
　[Xamarin.Forms+ReactivePropertyでスマホアプリ開発！《本編》](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)において、どのようにapkファイルに署名したのかといった話です。**この記事は長めです。**

# そもそも署名って？
　私達は日常的に「署名」していますが、その行為には**「この書面に私は同意しました」**という意味が込められています。
　一方、コンピューターにおける「署名」には、**「この○○の作者は確かに私です」**という意味が込められています。
　コンピューターで署名する際、事前に「この○○の作者は確かに私です」といったことを記すためのデータが作られ、それによって署名が行われます。このデータのことを**「証明書」**と呼びます。
　一般に、署名の実装には**公開鍵暗号**が用いられ、署名を施すための**秘密鍵は証明書の作者**が、署名や署名された中身を見るための**公開鍵は利用者**が持ちます(後者は一般に公開して構いません)。これにより、「この○○の作者は確かに△△である」ということが保証されます。
　こういった署名の話について、詳しくは次の資料などをご覧ください。
　　[公開鍵暗号と電子署名の基礎知識 - Qiita](qiita.com/kunichiko/items/ef5efdb41611d6cf7775)

# Androidにおける署名について
　Androidの場合、**署名されたアプリケーションじゃないとAndroid OS上で実行できない**仕様になっています。ただ、自分で証明書を用意しなくても、単にデバッグする分には**デバッグ用の証明書**が予め用意されていますのでそちらを使います(※)。しかし、完成したアプリを世に公開する際は、改めて証明書を用意して署名を行う必要があります。Androidアプリ用の署名には「自己署名証明書」(通称オレオレ証明書)でも大丈夫なので、署名のためのファイル(キーストア)は自前で簡単に作成できます。
　上記の説明の詳細については、次の公式資料をご覧ください。
　　[アプリケーションへの署名 | Android Developers](https://developer.android.com/guide/publishing/app-signing.html)

※……ここで言うところの「デバッグする分」とは、DebugビルドかReleaseビルドかといった話ではなく、「一般に配布するためでない開発用の分」といった意味です

# キーストアを作成してみよう
　作り方は**ググれば幾らでも出てくる**と思いますので、参考例を示すだけに留めます。「//」以降はコメントです。

```sample.log
>keytool -genkey -v -keystore sample.keystore -keysize 2048 -keyalg RSA -sigalg SHA256withRSA -alias test -validity 50000
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:        //「キーストアのパスワード」と同じものを再度入力
姓名は何ですか。
  [Unknown]:  Fubuki DD Fubuki
組織単位名は何ですか。
  [Unknown]:  Maiduru Naval Arsenal
組織名は何ですか。
  [Unknown]:  Imperial Japanese Navy
都市名または地域名は何ですか。
  [Unknown]:  Maiduru
都道府県名または州名は何ですか。
  [Unknown]:  Kyoto
この単位に該当する2文字の国コードは何ですか。
  [Unknown]:  JP                          // 日本国なら「JP」にする
CN=Fubuki DD Fubuki, OU=Maiduru Naval Arsenal, O=Imperial Japanese Navy, L=Maiduru, ST=Kyoto, C=JPでよろしいですか。
  [いいえ]:  y

50,000日間有効な2,048ビットのRSAの鍵ペアと自己署名型証明書(SHA256withRSA)を生成しています
        ディレクトリ名: CN=Fubuki DD Fubuki, OU=Maiduru Naval Arsenal, O=Imperial Japanese Navy, L=Maiduru, ST=Kyoto, C=jp
<test>の鍵パスワードを入力してください
        (キーストアのパスワードと同じ場合はRETURNを押してください):
[sample.keystoreを格納中]

>
```

　ちなみに上記における「エイリアス」は、一つのキーストアの中に複数格納できます。つまり、

- 「エイリアス」は一つの証明書
- 「キーストア」は一つ以上の証明書を格納する金庫

だと[例えられるらしい](https://blog.aroundit.net/android-keystore-alias/)です。Google的には**「中に一つのエイリアスを持つ一つのキーストアを持つだけで十分じゃね？」**らしいですが、アプリ毎に使い分けることにも一応利点はあるようです。個人的には普通に共通でいいと思いますが……。

# キーストアを使って署名してみよう

　まずVisual Studioでアプリをビルドします。「Release」ビルドで問題ないでしょう。
　次に、ソリューションエクスプローラーで、Shared ProjectではなくAndroid固有のProjectを選択して右クリックし、「アーカイブ…」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/2552df52-bb76-6721-8a93-93645165105c.png)

　すると、実行に必要なファイル群が、一つのapkファイルとして纏められます。このファイルはまだ署名されていませんので、Android端末でまだ実行できません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/212bc857-5836-e1f2-dbc9-4510204c5e9c.png)

　次に、署名したいアーカイブをリストから選択し、画面右下の「配布…」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/cd89ae61-e79a-5d14-eec4-d8196eb60a21.png)

　するとこういったウィンドウが表示されます。
　「アドホック」というのは、例えばGitHubなどにそのままアップロードしてしまい、Androidユーザーがブラウザ等でダウンロードしてからインストールする形式です。「Google Play」というのは、Google Playにアップロードするための形式です(たぶん)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/e7c05e68-aa2a-8e49-02e7-6bdf842e0ab6.png)

　「アドホック」を選択すると、次にこういった表示になります。ここでは、登録したキーストアを選択してから「名前を付けて保存」ボタンを押すことで署名処理が行われます。察しの通り、「＋」でキーストアの**新規作成**、「－」で選択したキーストアの**削除**、「インポート…」で先ほど作成したキーストアファイルの**インポート**が行えます。
　インポートの際は、「キーストアのパスワード」「使用するエイリアス」「使用するエイリアスにおけるパスワード」の3点セットを忘れないようにしましょう。また、「＋」ボタンを押すと**先ほどコマンドプロンプトで行った作業がGUIで行えます**が、この辺はお好みで。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/178817cd-7940-0045-badb-6e0ae02501d4.png)

　「名前を付けて保存」ボタンを押し、キーストアのパスワードやapkファイルの保存先を聞かれた後は、署名作業が行われます。
　それが完了すれば、晴れて外部に配布できるapkファイルが作成できるというわけですね。