Keytool 提示"不是已签名的 jar 文件"

Keytool 提示"不是已签名的 jar 文件",第1张

最近在着手对一批APK提取证书信息,却遇到了Bug。

正常情况下,我们借助Java自带的keytool工具,执行 keytool -printcert -jarfile a.apk ,就可以获得如下图所示的证书信息

但是在对几百个APK进行批量 *** 作的时候,发现有少数APK,执行上述命令时会提示"不是已签名的 jar 文件"

如果只是想解决这个问题倒是简单,只需要把apk包中META-INF/*.RSA文件解压出来,再调用 keytool -printcert -file CERT.RSA 即可(对于正常的APK,这两个命令获得的结果相同)

但是我还希望进一步探究其原因,由于keytool的源码网上找不到,因此只能另辟蹊径。

通过搜索,用于apk证书信息提取的工具,Java除了提供了keytool之外,还提供了一个叫做jarsigner的工具。接下来,

1)当尝试对每一个keytool无法解析的apk,调用 jarsigner -verify *.apk 时,结果中均有这么一句

“由于该 jar 是使用目前已禁用的弱算法签名的, 因此该 jar 将被视为未签名。”

2)当尝试对keytool能正常提取信息的apk,调用上述命令时,结果中均无此提示。

因此,我最终的猜测是:Keytool一旦检测到弱算法签名,就会提示说 "不是已签名的 jar 文件"。

目前只能分析到这了,而且还有一个未解之谜:为何 keytool -printcert -file a.RSA 的结果与 jarsigner -certs -verify a.apk 的结果中的签名算法可能不同?

本文如有错误,欢迎大家指正~

一:c:\zzz\SignedAppletDemo>jar cvf myapplet.jar *.*

执行完此步后,在signedappletdemo文件夹下产生myapplet.jar文件,主要是.class文件

二:c:\zzz\SignedAppletDemo>keytool -genkey -keystore mystore.store -alias my.store

执行完此步后,目录下出现mystore.store文件,为密钥库,此密钥库别名为my.store。

三:c:\zzz\SignedAppletDemo>keytool -export -keystore mystore.store -alias my.store -file mycert.cer

执行完此步后,目录下出现mycert.cer文件,就是一张证书

四:c:\zzz\SignedAppletDemo>jarsigner -keystore mystore.store myapplet.jar my.store

此步骤是对密钥库签名

然后把myapplet.jar,mystore.store,mycert.cer复制到用户目录下。

以上是服务器所做步骤

以下是客户机所做步骤

五:c:\zzz\SignedAppletDemo>keytool -import -keystore client.store -alias my.store -file mycert.cer

用户同意接收该证书,信任该证书颁发者的所有作品,也就是把收到的证书导入本地密钥库。

六:修改用户的policy文件,文件名为.java.policy放在用户主目录下。

七:对接收的文件进行验证

C:\zzz\SignedAppletDemo>jarsigner -verify -verbose -keystore mystore.store myapplet.jar

jar verified.

八:打开接收文件

C:\zzzSignedAppletDemo>jar -vxf myapplet.jar

那么用户就得到所有被签名的文件。

九:在用户端把生成的证书导入,即安装证书

转自 https://www.cnblogs.com/slysky/p/9780015.html

一.工具介绍

jarsigner是JDK提供的针对jar包签名的通用工具,

位于JDK/bin/jarsigner.exe

apksigner是Google官方提供的针对Android apk签名及验证的专用工具,

位于Android SDK/build-tools/SDK版本/apksigner.bat

不管是apk包,还是jar包,本质都是zip格式的压缩包,所以它们的签名过程都差不多(仅限V1签名),

以上两个工具都可以对Android apk包进行签名.

1.V1和V2签名的区别

在Android Studio中点击菜单 Build->Generate signed apk... 打包签名有两种签名选项 V1(Jar Signature) V2(Full APK Signature),

从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature)

但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing)

V1签名:

V2签名:

V2签名优点很明显:

注意: apksigner工具默认同时使用V1和V2签名,以兼容Android 7.0以下版本

2.zipalign和V2签名

位于Android SDK/build-tools/SDK版本/zipalign.exe

zipalign 是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗

zipalign -v 4 in.apk out.apk //4字节对齐优化

zipalign -c -v 4 in.apk //检查APK是否对齐

zipalign可以在V1签名后执行

但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!

二.签名步骤

1.生成密钥对(已有密钥库,可忽略)

Android Studio在Debug时,对App签名都会使用一个默认的密钥库:

1.生成密钥对

进入JDK/bin, 输入命令

参数:

提示: 可重复使用此条命令,在同一密钥库中创建多条密钥对

例如: 在debug.keystore中新增一对密钥,别名是release

keytool -genkeypair -keystore debug.keystore -alias release -validity 30000

2.查看密钥库

进入JDK/bin, 输入命令

keytool -list -v -keystore 密钥库名

参数:

例如:

keytool -list -v -keystore debug.keystore

现在debug.keystore密钥库中有两对密钥, 别名分别是androiddebugkey release

2.签名

1.方法一(jarsigner,只支持V1签名)

进入JDK/bin, 输入命令

从JDK7开始, jarsigner默认算法是SHA256, 但Android 4.2以下不支持该算法,

所以需要修改算法, 添加参数 -digestalg SHA1 -sigalg SHA1withRSA

参数:

例如:

用JDK7及以上jarsigner签名,不支持Android 4.2 以下

jarsigner -keystore debug.keystore MyApp.apk androiddebugkey

用JDK7及以上jarsigner签名,兼容Android 4.2 以下

jarsigner -keystore debug.keystore -digestalg SHA1 -sigalg SHA1withRSA MyApp.apk androiddebugkey

2.方法二(apksigner,默认同时使用V1和V2签名)

进入Android SDK/build-tools/SDK版本, 输入命令

若密钥库中有多个密钥对,则必须指定密钥别名

禁用V2签名

apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk

参数:

例如:

在debug.keystore密钥库只有一个密钥对

apksigner sign --ks debug.keystore MyApp.apk

在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名

apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey MyApp.apk

3.签名验证

1.方法一(keytool,只支持V1签名校验)

进入JDK/bin, 输入命令

keytool -printcert -jarfile MyApp.apk (显示签名证书信息)

参数:

2.方法二(apksigner,支持V1和V2签名校验)

进入Android SDK/build-tools/SDK版本, 输入命令

apksigner verify -v --print-certs xxx.apk

参数:

例如:

apksigner verify -v MyApp.apk


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11981011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存