双签名 .apk // SHA1 和其他问题

Double-Signing .apk // SHA1 & other issues

我目前在对 .apk 进行双重签名时遇到一些问题。 正常的工作流程总是:

zip -d FILE.apk META-INF/\*
jarsigner -verbose -keystore EXTERNAL.keystore FILE.apk EXTERNAL
jarsigner -verbose -keystore INTERNAL FILE.apk INTERNAL
zipalign -v 4 FILE.apk FILE_ALIGNED.apk

使用这种原始方法时,我从 Google Play 商店收到错误消息:

您上传的 APK 签名无效(了解有关签名的更多信息)。来自 apksigner 的错误:ERROR (Jar signer INTERNAL.RSA): JAR signature META-INF/INTERNAL.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported在 API 级别 [[14, 17]]

由于我仅针对 "INTERNAL.RSA" 收到此算法错误,因此我尝试使用:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore INTERNAL FILE.apk INTERNAL

这会导致另一个错误:

您上传的 APK 签名无效(了解有关签名的更多信息)。来自 apksigner 的错误:错误(Jar 签名者 EXTERNAL.DSA):META-INF/EXTERNAL.SF

中没有 assets/www/assets/fonts/FONT.ttf 的摘要

这只是错误的一小段,因为它列出了具有相同错误的应用程序的每个资产。我非常感谢有关如何解决此问题的所有帮助或提示。

干杯, 马吕斯

您可以尝试从 jarsigner 切换到 apksigner (https://developer.android.com/studio/command-line/apksigner.html)。原来的四个命令切换为:

zipalign -v -p 4 FILE.apk FILE_ALIGNED.apk
apksigner sign --ks EXTERNAL.keystore --next-signer --ks INTERNAL FILE_ALIGNED.apk

OP 中的第一个错误是由于具有 SHA-256 APK 签名的 RSA(现代 jarsigner 中的默认设置)在早于 API 18 级(Jelly Bean MR2)的平台上不受支持,并且APK 的 AndroidManifest.xml 声明(通过 android:minSdkVersion)APK 在 API 14 级及更高级别的平台上支持 运行。

P. S. 您可以通过 运行

来近似 Play 的 APK 签名检查行为
apksigner verify some.apk