web-dev-qa-db-ja.com

付属の証明書とは異なる証明書で.apkに再署名できますか?

Apkがある場合、現在の署名を削除し、別の.keystoreファイルを使用して再署名してもアプリケーションをインストールできますか?

更新:Jorgesysのソリューションで動作するようになりましたが、前に混乱したのは、.apkを解凍し、META-INFフォルダーを削除してからファイルの拡張子を元に戻した.apk。私がやるべきことは、winzipでそれを開き、winzip内のフォルダーを削除することです。

42
Anton

これを試して

1).apkの拡張子を.Zipに変更します

2)META-INFフォルダを開いて削除します

3)拡張子を.apkに変更します

4)新しいキーストアでjarsignerとzipalignを使用します。

それが役に立てば幸い

67
Jorgesys

簡単な解決策を探している場合は、オープンソースのapk-resignerスクリプトまたはGoogleのapksignerツールを使用できます

  • オープンソースのapk-resignerスクリプト https://github.com/onbiron/apk-resigner

    必要な作業は、スクリプトをダウンロードして、次のように入力するだけです。

   ./signapk.sh application.apk keystore key-pass alias
  • あるいは、さらに簡単な解決策として、リビジョン24.0.3以降で使用可能なGoogleのapksignerコマンドラインツールを使用できます。
apksigner sign --ks release.jks application.apk

Apksignerツールの詳細については、開発者Androidサイトをご覧ください。

https://developer.Android.com/studio/command-line/apksigner.html

27
Fatih
Zip -d my_application.apk META-INF/\*
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
8
kreker

v2署名スキーマ (ASでbuild-tools 24.0.3+を使用すると自動的になります)を使用する場合、v2が署名データを追加するため、APKからMETA-INFフォルダーを削除することはできませんZipメタブロックに。

Googleの 新しいapksigner build-tools 24.03(Android 7)で導入されたものは、APKを再署名できます。署名コマンドを繰り返すだけで、新しいキーストア/証明書で署名できます(古いキーストア/証明書は削除されます)。

apksigner sign --ks keystore.jks signed_app.apk

恥知らずのプラグ:複数のapkに署名でき、ログ出力の使用がより簡単なツールが必要な場合: https://github.com/patrickfav/uber-apk-signer (バックグラウンドでGoogleのapksigner.jarを使用)

8
patrickf

リリースの署名:$ 1.apk-> $ 1_release.apk "GeneralMills&GoogleApps#2012ステップ1:以前の署名を削除する.apkの拡張子を.Zipに変更するフォルダーMETA-INFを開いて削除する拡張子を.apkまたはコマンドに変更:•Zip [originalapk]例:•Zip "$ 1" .apk -d

ステップ2:release.keystoreで署名します。コマンド:•jarsigner –verbose –keystore [keystorefile] –signedjar [unalignedapk] [originalapk] alias_name例:•C:\ Program Files\Java\jdk1.6.0_43\bin> jarsigner- verbose -keystore release.keystore -signedjar "$ 1" _unaligned.apk "$ 1" .apk release

ステップ3:整列コマンド:•zipalign -f 4 [unalignedapk] [releaseapk]例:•C:\ Users\G535940\Downloads\adt-bundle-windows-x86\adt-bundle-windows-x86\sdk\too ls> zipalign -f 4 "$ 1" _unaligned.apk "$ 1" _release.apk

ステップ4:コマンドのクリーンアップ:•rm 4 [unalignedapk]例:•rm "$ 1" _unaligned.apk

追加のコマンドが役立つ場合があります。

  1. Keytool keytool -genkey -alias -keystoreで新しいキーを生成するには

  2. キーを一覧表示するにはkeytool -list -keystore

Facebook機能のキーハッシュを生成するコマンド

コマンド:•keytool -exportcert -alias alias_name -keystore [keystorefile] | openssl sha1-バイナリ| openssl base64

例:•C:\ Program Files\Java\jdk1.6.0_43\bin> keytool -exportcert -alias release -keyst ore release.keystore | opens l sha1 -binary | openssl base64

注:APKに署名するために、JDKを1.7から1.6.0_43にダウングレードしました。

理由:JDK 7では、デフォルトの署名アルゴリズムが変更され、APKに署名するときに署名とダイジェストアルゴリズム(-sigalgおよび-digestalg)を指定する必要があります。

コマンド:jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile] [originalapk] alias_name

7
Harsha.Vaswani

上記のすべてのソリューションが機能します。再圧縮したときにうまくいかなかった理由に注意してください:

.apk内のファイルの一部は、保存されたままにする必要があります(0%の圧縮)。これは、Androidはメモリマッピング(mmap)を使用して、メモリにアンパックせずにコンテンツを読み取るためです。このようなファイルは.oggといくつかのアイコンです。

3
gilm

キーがkeys.keystoreに保存されていると仮定すると、次を実行できます。

$ keytool -list -keystore keys.keystore
Your keystore contains 1 entry

your_key_alias, Jan 3, 2013, PrivateKeyEntry, 
Certificate fingerprint (SHA1): 8C:C3:6A:DC:7E:B6:12:F1:4C:D5:EE:F1:AE:17:FB:90:89:73:50:53

キーのエイリアスを決定します。次に実行します:

Zip -d your_app.apk "META-INF/*"
jarsigner -verbose -keystore keys.keystore \
   -sigalg MD5withRSA -digestalg SHA1 -sigfile CERT \
   your_app.apk your_key_alias

your_app.apkという名前のキーでyour_key_aliasに再署名します。

JDK 8以降、余分な-sigfile CERTオプションが必要と思われます。

2
Phil Calvin