Android アプリで App Links を実装したが、うまく機能せず、アプリの署名に問題があった。

# ０．はじめに

Android アプリで App Links を実装してみたんですが、どうしてもうまく機能しなくて、非常に困っていたところ、どうやらアプリの署名に問題があったみたいですので、とりあえずシェア。

# １． 発生していた事象
* Android アプリには、App Link の処理を実装済み。
* サーバーには、.well-known/assetlinks.json を設定済み。
* Android Studio での App Link のテストは問題無し。
* デバッグモードでは、正常に機能。
* どうやら、Google Play 経由だと App Links が正常に機能しないみたい？

# ２． 発生していた事象を元に色々と調査
* アプリの署名を確認したところ、「アプリへの署名証明書」と「アップロード証明書」が全く同じものだった…。
* ![FireShot Capture 054 - アプリの署名 - 現場クラウド Conne - Google Play Console - play.google.com.png](https://qiita-image-store.s3.amazonaws.com/0/161939/00621362-a66c-bdb4-c15a-f2e2e0facd21.png)
* ひとまず、アップロード鍵のリセットをすることに。

# ３． Google Play Console のアップロード証明書のリセット
1. Google Play デベロッパーサポートにお問い合わせます。
    * [Play Console ヘルプ](https://support.google.com/googleplay/android-developer)
1. すると、以下の様な案内が届きます。
    * <blockquote>
もしご希望でしたら鍵のリセットを行います。<br>
その際は下記手順にしたがってご返信くださいませ。<br>
<br>
<ol>
<li>Android Studio ヘルプセンター記事「キーとキーストアを生成する」の手順に沿って、新しい鍵を生成。新しい鍵は、以前の鍵とは異なるものである必要があります。または、次のコマンドラインを使用して新しい鍵を生成することもできます。<br>
keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks<br>
この鍵は、25 年間有効な 2048 ビットの RSA 鍵である必要があります。<br></li>
<br>
<li>その鍵の証明書を PEM 形式でエクスポート:<br>
keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks </li>
<br>
<li>upload_certificate.pem ファイルを添付して、このメールに返信</li>
</ol>
ご返信をお待ちしております。他にご不明な点がございましたらお気軽にお問い合わせください
</blockquote>
1. 手順に従って、新しい証明書を作成します。
    * <b><font color="red">Android Studio でキーストアを生成すると、2.の PEM 形式のエクスポートでこけた…。なので、今回は、コマンドラインで生成します。理由は不明。</font></b>
        * 以下に記載した「キーストアのパスワード」と「キーのパスワード」が異なることが影響してたのかも。
        * 確認してみたらやっぱりそうでした。PEM 形式へエクスポートするのであれば、「キーストアのパスワード」と「キーのパスワード」を同じにしないとダメみたいです。
        * それとも、PEM 形式へのエクスポートコマンドに何らかのオプション指定でもしたら、出来るのだろうか？
    * <b><font color="red">また、コマンドラインでの作成の場合、Android Studio の様に「キーストアのパスワード」「キーのパスワード」に２つの異なるパスワードを設定することはできず、「キーのパスワード」に「キーストアのパスワード」と同じものが設定される様です。</font></b>
        * `警告: PKCS12キーストアでは、ストアのパスワードとキーのパスワードが異なる状況はサポートされません。ユーザーが指定した-keypassの値は無視します。`
        * [鍵を生成してAPKファイルに署名をする \- Qiita](https://qiita.com/residenti/items/48b75b82d931168aed07)
    * <blockquote>
$ keytool -genkeypair -alias <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ証明書用ｷｰｴｲﾘｱｽ\]</font> -keyalg RSA -keysize 2048 -validity 9125 -keystore <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ用証明書ｷｰｽﾄｱﾌｧｲﾙ（.jks）\]</font><br>
キーストアのパスワードを入力してください: <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ証明書用ｷｰｽﾄｱﾊﾟｽﾜｰﾄﾞ\]</font><br>
新規パスワードを再入力してください: <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ証明書用ｷｰｽﾄｱﾊﾟｽﾜｰﾄﾞ\]</font><br>
姓名は何ですか。<br>
  \[Unknown\]: <font color="red">※任意 (アプリ名など)</font><br>
組織単位名は何ですか。<br>
  \[Unknown\]:<br>
組織名は何ですか。<br>
  \[Unknown\]:<br>
都市名または地域名は何ですか。<br>
  \[Unknown\]:<br>
都道府県名または州名は何ですか。<br>
  \[Unknown\]:<br>
この単位に該当する2文字の国コードは何ですか。<br>
  \[Unknown\]:<br>
CN=〜, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknownでよろしいですか。<br>
  \[いいえ\]:Y<br>
<br>
9,125日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA256withRSA)を生成しています<br>
	ディレクトリ名: CN=〜, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown<br>
</blockquote>
1. 手順に従って、PEM 形式のアップロード証明書を作成します。
    * <blockquote>
$ keytool -export -rfc -alias <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ証明書用ｷｰｴｲﾘｱｽ\]</font> -file <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ用証明書ﾌｧｲﾙ（.pem）\]</font> -keystore <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ用証明書ｷｰｽﾄｱﾌｧｲﾙ（.jks）\]</font><br>
キーストアのパスワードを入力してください: <font color="red">\[ｱｯﾌﾟﾛｰﾄﾞ証明書用ｷｰｽﾄｱﾊﾟｽﾜｰﾄﾞ\]</font><br>
証明書がファイル<〜.pem>に保存されました<br>
</blockquote>
1. 作成した PEM 形式のアップロード証明書を Google Play デベロッパーサポートへ送付します。
<br><br>
1. すると、以下の様なメールが届きます。
    * ![FireShot Capture 057 - 現場クラウド Conne（com.genbacloud.conne）のアップロード鍵のリセットがリクエストされました - y.uekama_ - mail.google.com.png](https://qiita-image-store.s3.amazonaws.com/0/161939/f722d6f8-c223-6de4-7799-beb2ac4e9bc3.png)
    * <blockquote>
新しいアップロード鍵の登録が完了しましたので、ご連絡いたします。以下の場所にあるキーストアを更新してくださいますようお願いいたします。<br>
<br>
ローカルマシン<br>
ロックされたオンサイト サーバー（各種 ACL）<br>
クラウドマシン（各種 ACL）<br>
専用の秘密管理サービス<br>
（git）リポジトリ<br>
新しい鍵は以下の日時よりご使用いただけます: 2019-03-28 03:00:58 UTC<br>
お待ちくださいましたことに感謝申し上げます。他にご不明な点がございましたら、お気軽にお問い合わせください。<br>
</blockquote>
1. しばらくすると、Google Play Console の「アプリの署名」が以下の様な表示になり、アップロード証明書が更新されました。
    * ![FireShot Capture 055 - アプリの署名 - 現場クラウド Conne - Google Play Console - play.google.com.png](https://qiita-image-store.s3.amazonaws.com/0/161939/6b6eeb15-8182-dc4b-cffb-e43b32cd5c2e.png)

その後、マニフェストファイルの設定ミスなどありながらも、何とか App Links が正常に機能する様になりました〜。

良かった〜。

# ９９．ハマりポイント

* 今回はかなりハマりました…。
<br><br>
* とにかく、証明書の問題だと行き着くまでに相当時間が掛かりました。
* 色々なパターンで、うまく行くか、うまく行かないかを確認して…。
* ようやくたどり着きました…。
<br><br>
* 正直、このアップロード証明書って凄くわかりづらい…。
* アプリ署名と同じ証明書を Google Play Console のアップロード証明書に登録しても、怒られないし…。
* どうせだったら怒ってほしい…。
<br><br>
* とりあえず、
* Google Play 経由の場合は、アップロード証明書のキーストアでサイニングして、Google Play へアップロードすると、Google Play でアプリ署名の証明書のキーストアで再度サイニングして配布。
* それ以外(主にデバッグ)の場合は、アプリ署名の証明書のキーストアでサイニングして配布。
* ってことみたいです。

# ＸＸ．まとめ

とりあえず、解決して良かった〜♪

* ※参考
    * [既存アプリにGoogle Play App Signingを対応させてハマったこと \- Qiita](https://qiita.com/n_morioka/items/746b32b934d768cbc560)

では♪