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


【記事ツリー】

概要

 Xamarin.Forms+ReactivePropertyでスマホアプリ開発!《本編》において、どのようにapkファイルに署名したのかといった話です。この記事は長めです。

そもそも署名って?

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

Androidにおける署名について

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

※……ここで言うところの「デバッグする分」とは、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を格納中]

>

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

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

だと例えられるらしいです。Google的には「中に一つのエイリアスを持つ一つのキーストアを持つだけで十分じゃね?」らしいですが、アプリ毎に使い分けることにも一応利点はあるようです。個人的には普通に共通でいいと思いますが……。

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

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

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

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

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

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

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