Java 安装\u解析\u失败\u无\u证书安装修改的apk文件失败(SHA1签名无效),即使在与jarsigner签名后也是如此

Java 安装\u解析\u失败\u无\u证书安装修改的apk文件失败(SHA1签名无效),即使在与jarsigner签名后也是如此,java,android,jar-signing,android-keystore,Java,Android,Jar Signing,Android Keystore,我知道还有很多人在忘记签署apk时遇到安装解析失败无证书错误。这不是我要描述的问题。我将分几个步骤详细说明我正在做什么 我有一个zipaligned签名的apk文件(AndroidWorld.apk)。我可以安装这个没有问题。到目前为止,一切顺利 接下来,我用apktool反编译apk。而且,到目前为止还不错 之后,我使用asmdex修改classes.dex文件并注入一些方法日志记录。此时,如果我重新打包apk并尝试安装,它肯定会失败,因为classes.dex的签名与签名清单中的签名不再匹配

我知道还有很多人在忘记签署apk时遇到安装解析失败无证书错误。这不是我要描述的问题。我将分几个步骤详细说明我正在做什么

我有一个zipaligned签名的apk文件(AndroidWorld.apk)。我可以安装这个没有问题。到目前为止,一切顺利

接下来,我用apktool反编译apk。而且,到目前为止还不错

之后,我使用asmdex修改classes.dex文件并注入一些方法日志记录。此时,如果我重新打包apk并尝试安装,它肯定会失败,因为classes.dex的签名与签名清单中的签名不再匹配。我意识到这一点。因此,我重新打包apk,对其进行zipalign,然后使用我自己的密钥库对其进行签名:

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore "android_new_sample.keystore" -storepass mypass "C:\apk\AndroidWorld-release.apk" asample
Signing with keystore android_sample.keystore alias asample
   adding: META-INF/MANIFEST.MF
   adding: META-INF/ASAMPLE.SF
   adding: META-INF/ASAMPLE.RSA
  signing: assets/x.js
  signing: assets/x.css
  signing: assets/special_offers.html
  signing: res/layout/displayjourneylist.xml
  signing: res/layout/journey_row.xml
  signing: res/layout/login.xml
  signing: res/layout/searchjourney.xml
  signing: res/layout/settings.xml
  signing: res/layout/webview.xml
  signing: res/layout/window_title.xml
  signing: res/menu/option_menu.xml
  signing: AndroidManifest.xml
  signing: resources.arsc
  signing: res/drawable-hdpi/header.png
  signing: res/drawable-hdpi/ic_launcher.png
  signing: res/drawable-ldpi/header.png
  signing: res/drawable-ldpi/ic_launcher.png
  signing: res/drawable-mdpi/header.png
  signing: res/drawable-mdpi/ic_launcher.png
  signing: classes.dex
  signing: assets/x-runtime.properties
        1 file(s) copied.
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore android_new_sample.keystore AndroidWorld-release-final.apk asample
Enter Passphrase for keystore: mypass
 updating: META-INF/ASAMPLE.SF
 updating: META-INF/ASAMPLE.RSA
  signing: assets/x.js
  signing: assets/xx.css
  signing: assets/special_offers.html
  signing: res/layout/displayjourneylist.xml
  signing: res/layout/journey_row.xml
  signing: res/layout/login.xml
  signing: res/layout/searchjourney.xml
  signing: res/layout/settings.xml
  signing: res/layout/webview.xml
  signing: res/layout/window_title.xml
  signing: res/menu/option_menu.xml
  signing: AndroidManifest.xml
  signing: resources.arsc
  signing: res/drawable-hdpi/header.png
  signing: res/drawable-hdpi/ic_launcher.png
  signing: res/drawable-ldpi/header.png
  signing: res/drawable-ldpi/ic_launcher.png
  signing: res/drawable-mdpi/header.png
  signing: res/drawable-mdpi/ic_launcher.png
  signing: classes.dex
  signing: assets/xxx.properties
没有抱怨,对吗?看起来classes.dex已经签名了,它没有抱怨。但是现在,如果我用jarsigner-verify检查签名的apk的完整性,它会不高兴:

jarsigner.exe -verify -verbose -certs C:\apk\AndroidWorld-release-signed.apk
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex
我已确保卸载设备上现有的应用程序,但尝试安装此apk仍会显示install_PARSE_FAILED_NO_CERTIFICATES消息。我曾在JavaJDK1.6和1.7中尝试过这一点,因为我知道在这些版本()之间对jarsigner进行了一些更改。如您所见,我在签名时指定了sigalg和digestalg标志


另一个奇怪的怪癖-如果我使用一个调试密钥库,所有这些都可以正常工作。

好的,经过一点挖掘,下面是我发现的

检测以前已签名的应用程序,但使用新密钥库对其进行签名时,会出现问题。具体来说,我们在\meta inf中得到多个签名清单,所有这些清单都指向同一组文件。应用程序安装失败,错误为install\u PARSE\u FAILED\u NO\u CERTIFICATES

如果查看签名清单,您会看到两个文件:

现在,我们修改classes.dex并使用自己的密钥库对应用程序进行签名:

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore "android_new_sample.keystore" -storepass mypass "C:\apk\AndroidWorld-release.apk" asample
Signing with keystore android_sample.keystore alias asample
   adding: META-INF/MANIFEST.MF
   adding: META-INF/ASAMPLE.SF
   adding: META-INF/ASAMPLE.RSA
  signing: assets/x.js
  signing: assets/x.css
  signing: assets/special_offers.html
  signing: res/layout/displayjourneylist.xml
  signing: res/layout/journey_row.xml
  signing: res/layout/login.xml
  signing: res/layout/searchjourney.xml
  signing: res/layout/settings.xml
  signing: res/layout/webview.xml
  signing: res/layout/window_title.xml
  signing: res/menu/option_menu.xml
  signing: AndroidManifest.xml
  signing: resources.arsc
  signing: res/drawable-hdpi/header.png
  signing: res/drawable-hdpi/ic_launcher.png
  signing: res/drawable-ldpi/header.png
  signing: res/drawable-ldpi/ic_launcher.png
  signing: res/drawable-mdpi/header.png
  signing: res/drawable-mdpi/ic_launcher.png
  signing: classes.dex
  signing: assets/x-runtime.properties
        1 file(s) copied.
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore android_new_sample.keystore AndroidWorld-release-final.apk asample
Enter Passphrase for keystore: mypass
 updating: META-INF/ASAMPLE.SF
 updating: META-INF/ASAMPLE.RSA
  signing: assets/x.js
  signing: assets/xx.css
  signing: assets/special_offers.html
  signing: res/layout/displayjourneylist.xml
  signing: res/layout/journey_row.xml
  signing: res/layout/login.xml
  signing: res/layout/searchjourney.xml
  signing: res/layout/settings.xml
  signing: res/layout/webview.xml
  signing: res/layout/window_title.xml
  signing: res/menu/option_menu.xml
  signing: AndroidManifest.xml
  signing: resources.arsc
  signing: res/drawable-hdpi/header.png
  signing: res/drawable-hdpi/ic_launcher.png
  signing: res/drawable-ldpi/header.png
  signing: res/drawable-ldpi/ic_launcher.png
  signing: res/drawable-mdpi/header.png
  signing: res/drawable-mdpi/ic_launcher.png
  signing: classes.dex
  signing: assets/xxx.properties
到目前为止没有问题,我们已经将所有新的签名添加到清单中。但是,尝试验证此apk的完整性现在失败:

jarsigner.exe -verify -verbose -certs C:\apk\AndroidWorld-release-signed.apk
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex
原因是\meta inf中现在有重复的签名信息:

因此classes.dex有两个不同的签名,一个在Asample.sf中,一个在Cert.sf中:

Name: classes.dex (ASample.cf) 
SHA1-Digest: mTf659/NTkTqqsAEZc3gTlbRpW8=

Name: classes.dex (Cert.sf)
SHA1-Digest: hkAsCEcLyM52Q6gq2uQIqc/7Gh8=

这会导致验证和安装失败。如果我从存档中删除Cert.rsa和Cert.sf,它将进行验证并安装。因此,解决方案是修改zipfile并删除原始签名证书,只留下我自己的。

我删除了cert.SF/cert.RSA/MANIFEST.MF文件,然后重新签名,结果很好。

我遇到了类似的问题。验证总是被classes.dex阻塞,尽管我没有重复签名的问题。在重建jar并重新命名之前删除META-INF中的Cert.*修复了它。是的,最后。和往常一样,错误信息就像圣经一样具有解释性。这对4年前给出的答案有什么补充?我需要,所以我认为其他一些人也需要。