0.はじめに
Android アプリで App Links を実装してみたんですが、どうしてもうまく機能しなくて、非常に困っていたところ、どうやらアプリの署名に問題があったみたいですので、とりあえずシェア。
1. 発生していた事象
- Android アプリには、App Link の処理を実装済み。
- サーバーには、.well-known/assetlinks.json を設定済み。
- Android Studio での App Link のテストは問題無し。
- デバッグモードでは、正常に機能。
- どうやら、Google Play 経由だと App Links が正常に機能しないみたい?
2. 発生していた事象を元に色々と調査
3. Google Play Console のアップロード証明書のリセット
- Google Play デベロッパーサポートにお問い合わせます。
- すると、以下の様な案内が届きます。
もしご希望でしたら鍵のリセットを行います。
その際は下記手順にしたがってご返信くださいませ。
- Android Studio ヘルプセンター記事「キーとキーストアを生成する」の手順に沿って、新しい鍵を生成。新しい鍵は、以前の鍵とは異なるものである必要があります。または、次のコマンドラインを使用して新しい鍵を生成することもできます。
keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks
この鍵は、25 年間有効な 2048 ビットの RSA 鍵である必要があります。
- その鍵の証明書を PEM 形式でエクスポート:
keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks - upload_certificate.pem ファイルを添付して、このメールに返信
- Android Studio ヘルプセンター記事「キーとキーストアを生成する」の手順に沿って、新しい鍵を生成。新しい鍵は、以前の鍵とは異なるものである必要があります。または、次のコマンドラインを使用して新しい鍵を生成することもできます。
- 手順に従って、新しい証明書を作成します。
-
Android Studio でキーストアを生成すると、2.の PEM 形式のエクスポートでこけた…。なので、今回は、コマンドラインで生成します。理由は不明。
- 以下に記載した「キーストアのパスワード」と「キーのパスワード」が異なることが影響してたのかも。
- 確認してみたらやっぱりそうでした。PEM 形式へエクスポートするのであれば、「キーストアのパスワード」と「キーのパスワード」を同じにしないとダメみたいです。
- それとも、PEM 形式へのエクスポートコマンドに何らかのオプション指定でもしたら、出来るのだろうか?
-
また、コマンドラインでの作成の場合、Android Studio の様に「キーストアのパスワード」「キーのパスワード」に2つの異なるパスワードを設定することはできず、「キーのパスワード」に「キーストアのパスワード」と同じものが設定される様です。
警告: PKCS12キーストアでは、ストアのパスワードとキーのパスワードが異なる状況はサポートされません。ユーザーが指定した-keypassの値は無視します。
- 鍵を生成してAPKファイルに署名をする - Qiita
$ keytool -genkeypair -alias [アップロード証明書用キーエイリアス] -keyalg RSA -keysize 2048 -validity 9125 -keystore [アップロード用証明書キーストアファイル(.jks)]
キーストアのパスワードを入力してください: [アップロード証明書用キーストアパスワード]
新規パスワードを再入力してください: [アップロード証明書用キーストアパスワード]
姓名は何ですか。
[Unknown]: ※任意 (アプリ名など)
組織単位名は何ですか。
[Unknown]:
組織名は何ですか。
[Unknown]:
都市名または地域名は何ですか。
[Unknown]:
都道府県名または州名は何ですか。
[Unknown]:
この単位に該当する2文字の国コードは何ですか。
[Unknown]:
CN=〜, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknownでよろしいですか。
[いいえ]:Y
9,125日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA256withRSA)を生成しています
ディレクトリ名: CN=〜, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
-
Android Studio でキーストアを生成すると、2.の PEM 形式のエクスポートでこけた…。なので、今回は、コマンドラインで生成します。理由は不明。
- 手順に従って、PEM 形式のアップロード証明書を作成します。
$ keytool -export -rfc -alias [アップロード証明書用キーエイリアス] -file [アップロード用証明書ファイル(.pem)] -keystore [アップロード用証明書キーストアファイル(.jks)]
キーストアのパスワードを入力してください: [アップロード証明書用キーストアパスワード]
証明書がファイル<〜.pem>に保存されました
- 作成した PEM 形式のアップロード証明書を Google Play デベロッパーサポートへ送付します。
- すると、以下の様なメールが届きます。
- しばらくすると、Google Play Console の「アプリの署名」が以下の様な表示になり、アップロード証明書が更新されました。
その後、マニフェストファイルの設定ミスなどありながらも、何とか App Links が正常に機能する様になりました〜。
良かった〜。
99.ハマりポイント
- 今回はかなりハマりました…。
- とにかく、証明書の問題だと行き着くまでに相当時間が掛かりました。
- 色々なパターンで、うまく行くか、うまく行かないかを確認して…。
- ようやくたどり着きました…。
- 正直、このアップロード証明書って凄くわかりづらい…。
- アプリ署名と同じ証明書を Google Play Console のアップロード証明書に登録しても、怒られないし…。
- どうせだったら怒ってほしい…。
- とりあえず、
- Google Play 経由の場合は、アップロード証明書のキーストアでサイニングして、Google Play へアップロードすると、Google Play でアプリ署名の証明書のキーストアで再度サイニングして配布。
- それ以外(主にデバッグ)の場合は、アプリ署名の証明書のキーストアでサイニングして配布。
- ってことみたいです。
XX.まとめ
とりあえず、解決して良かった〜♪
では♪