我可以使用与其附带的证书不同的证书重新签名.apk吗?

时间:2010-07-16 16:58:57

标签: android signing apk

如果我有一个apk,我可以删除当前的签名,还有一些如何使用不同的.keystore文件重新签名并仍然安装应用程序?

更新:我设法让它与Jorgesys的解决方案一起工作,之前我搞砸了我解压缩.apk然后在删除META-INF文件夹并更改文件后重新解压缩它延伸回.apk。我应该做的只是用winzip打开它并删除winzip里面的文件夹。

7 个答案:

答案 0 :(得分:67)

试试这个

  

1)将.apk的扩展名更改为.zip

     

2)打开并删除文件夹META-INF

     

3)将扩展名更改为.apk

     

4)将jarsigner和zipalign与新的密钥库一起使用。

希望有所帮助

答案 1 :(得分:26)

如果您正在寻找快速解决方案,可以使用开源apk-resigner脚本或Google的apksigner工具

   ./signapk.sh application.apk keystore key-pass alias
  • 或者,更简单的解决方案,您可以使用修订版24.0.3及更高版本中提供的 Google的apksigner命令行工具。
apksigner sign --ks release.jks application.apk

您可以在开发者Android网站上找到有关apksigner工具的更多信息。

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

答案 2 :(得分:8)

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

答案 3 :(得分:7)

签署发布:$ 1.apk - > $ 1_release.apk” 通用磨坊和放大器;的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

  3. 为Facebook功能生成keyhash的命令

    命令: •keytool -exportcert -alias alias_name -keystore [keystorefile] | openssl sha1 -binary | openssl base64

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

    注意: 为了签署我们的申请,我们已将JDK从1.7升级到1.6.0_43更新。

    原因: 从JDK 7开始,默认的签名算法已经改变,要求您在签署APK时指定签名和摘要算法(-sigalg和-digestalg)。

    命令: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile] [originalapk] alias_name

答案 4 :(得分:6)

请注意,如果您使用v2 signing schema(如果您在AS中使用build-tools 24.0.3+,则会自动删除),您不能仅从APK中删除META-INF文件夹,因为v2会将其签名数据添加到zip meta block。

然而,在构建工具24.03(Android 7)中引入的谷歌new apksigner能够重新签名APK。您可以重复签名命令以使用新的密钥库/证书进行签名(旧的密钥库/证书将被删除)。

apksigner sign --ks keystore.jks signed_app.apk

无耻插件:如果你想要一个更简单的工具,可以签署多个apks并使用更好的日志输出:https://github.com/patrickfav/uber-apk-signer(在后台使用Google的apksigner.jar)

答案 5 :(得分:3)

以上所有解决方案都有效。请注意为什么当您重新压缩时它不适合您:

.apk中的某些文件需要保留存储(压缩率为0%)。这是因为Android将使用内存映射(mmap)来读取内容而无需解压缩到内存中。这些文件是.ogg和一些图标。

答案 6 :(得分:1)

假设您的密钥存储在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选项。