過去に開発した Adobe AIR アプリを、 新しく開発した Cordova アプリに置き換えようとしたところ、うまくいかず、鍵ストアファイルの形式変換や、アプリの署名で非常に手間取ってしまった為、一連の情報を整理してみました。Adobe AIR や Cordova に限らず、既存のアプリを他のフレームワークで開発したアプリに置き換えたい場合にも参考になるかもしれません。
今回対象となるアプリは Android アプリです。iOSアプリについても今後検証する予定です。
署名が一致しないことが原因でアプリが上書きインストールできない場合、以下のようなメッセージが表示されます。
「名前が同じで、署名が競合するパッケージが既にインストールされています。」
鍵ストアファイルの操作には Java SDK に同梱されている keytool コマンドを使用します。
まずは旧アプリの署名内容を確認を行います。
keytool -list -printcert -jarfile old-app.apk
実行結果
次に旧アプリの署名に使用したであろう鍵ストアファイルの内容を確認します。
鍵ストアファイルには主に以下の2種類の形式が存在します。
形式 | 拡張子 | 説明 |
---|---|---|
PKCS#12 | .p12 もしくは .pfx | Public-Key Cryptography Standardsの略。パスワードに基づく鍵(暗号)により保護された秘密鍵と、それに関連する公開鍵証明書を保管するために利用されるファイルフォーマットの定義。PFXは PKCS#12 の旧称。Adobe AIR ではこの形式が使用されていました。 |
JKS | .jks もしくは .keystore | Java KeyStoreの略。非公開鍵、および関連する証明書または証明書チェーンの両方のデータベース形式。Android で採用されているのはこの形式です。 |
◆ PKCS#12 (.p12) の場合
keytool -v -list -storetype pkcs12 -keystore mykey.p12
実行結果
◆ JKS (.keystore) の場合
keytool -v -list -keystore mykey.keystore
実行結果
フィンガプリントの内容が一致していない場合はここから先に進めません。署名に使用した鍵ストアファイルを探すところから始める必要があります。
PKCS#12形式(.p12)とJKS形式(.keystore)の鍵ストアファイルは相互に変換が可能です。
それぞれ以下のコマンドで変換を行います。
◆ PKCS#12形式(.p12) から JKS形式(.keystore) へ変換する場合
keytool -importkeystore -srckeystore mykey.p12 -destkeystore mykey.keystore -srcstoretype pkcs12
◆ JKS形式(.keystore) からPKCS#12形式(.p12) へ変換する場合
keytool -importkeystore -srckeystore mykey.keystore -destkeystore mykey.p12 -srcstoretype jks -deststoretype pkcs12
署名の準備が整ったら、リリース用の未署名のアプリを生成します。Cordova の場合、以下のコマンドにて生成可能です。
cordova build android --release
未署名のアプリにJKS形式(.keystore)の鍵ストアファイルを使用して、署名を行います。
jarsigner -verbose -keystore mykey.keystore android-release-unsigned.apk myname
※myname はエイリアス名です。わからない場合は、以下のコマンドの表示結果の「別名」にて確認可能です。
keytool -v -list -keystore mykey.keystore
最後に 以下のコマンドの表示結果と、署名に使用したフィンガプリントで同じ内容がされていれば上書きインストールが可能となります。
keytool -list -printcert -jarfile android-release-unsigned.apk