最近在着手对一批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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)