鍵ストアファイルとアプリの署名に関する情報の整理


既存の 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

関連記事:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です