Android给apk签名那点事

作者: 程序亦非猿 | 来源:发表于2015-12-25 21:35 被阅读15134次

前言

前几天老大的6p一打开应用就奔溃,于是与让我给应用适配6.0.后来最后发布内测版本后,发现又是打开立即奔溃,在确定我代码push之后,找了一下原因,最终发现是梆梆加固搞的鬼.
然后老大又让我去尝试其他加固方案,又因为加固后又需要重新加固,所以就有了这篇笔记.

签名

签名是为了什么

简单来说,签名可以保证我们的应用可以正常升级,并且不被别人覆盖.
算是一个标识.

工具

  • keytool 是个密钥和证书管理工具,可以用来生成证书.
  • jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名

使用keytool生成证书:

keytool -genkey -keystore test.keystore  -alias test -keyalg RSA -validity 10000

参数解释:

  1. -genkey 产生证书文件
  2. -keystore 指定密钥库的.keystore文件中
  3. -keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
  4. -validity 为证书有效天数,这里我们写的是10000天
  5. -alias 产生别名
效果图

网上搜索到的生成证书的方法都尼玛是错的,都是误导人的,具体请看后续!!!

另外keytool还能查看信息:

test  keytool -list -keystore test.keystore

结果:

➜  test  keytool -list -keystore test.keystore
输入密钥库口令:

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

test.keystore, 2015-11-20, PrivateKeyEntry,
证书指纹 (SHA1): 21:94:9F:48:7D:38:EE:5A:63:16:8F:46:1B:6E:73:89:53:7D:7B:5C

签名

可以使用jarsigner 来签名,例子如下:

jarsigner -verbose -keystore test.keystore -signedjar -signed.apk unsigned.apk 'test.keystore'

参数说明:

  1. -verbose:指定生成详细输出
  2. -keystore:指定数字证书存储路径
  3. -signedjar:该选项的三个参数为 签名后的apk包 未签名的apk包 数字证书别名(注意顺序)
效果

(原来用的t.apk,发现不利于理解,于是后面改名了)

遇到坑了,找不到xxx证书链什么鬼!
后来搜索了很久之后才看到了一句要跟别名一样,我就在想我原来用的代码是这样的:

keytool -genkey -keystore test.keystore  -alias test.keystore -keyalg RSA -validity 10000

诶?好像没问题啊,test.keystore的别名test.keystore,是一样的啊,后来想想不对啊,test.keystore的后缀不应该加入上去吧,于是去掉keystore后再次重新生成一遍

keytool -genkey -keystore test.keystore  -alias test -keyalg RSA -validity 10000

然后再次执行签名:

jarsigner -verbose -keystore test.keystore -signedjar signed.apk t.apk 'test'

成功了!~So happy!!~~

最终效果

不过其实后面还顺带了一个警告:
未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期日期 (2043-04-07) 或以后的任何撤销日期之后, 用户可能无法验证此 jar。
想来似乎没什么,就没管了.

吐个槽:国内的有些文章真的很坑人,几篇错误的文章尼玛到处复制黏贴,到处都是,真是给跪了

debug.keystore的故事

说点小插曲,小知识:

  1. AndroidStudio会自动生成一个默认的debug.keystore,它存放在~/.android/目录下.
  2. 如果一不小心删了(其实我是rm了它),只要重新run一遍debug版应(不指定signingConfig),AS会再次自动创建
  3. 它默认密码为 android

小结

一个加固导致崩溃引发的血案~
最终让我学会了如何用cmd来签名APK,来装逼,哦哈哈~~~
新技能get!~

另外欢迎关注:
我的Github
我的微博
我的微信公众号:

微信公众号

相关文章

网友评论

  • codeTo:博主改一下 最后单引号不用要
  • elecdog:所以放弃梆梆加固后选择了啥加固方式?
  • 936542fb82ce:最后的别名不需要加单引号。
  • 31b38127f476:'test' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
  • 6f15742713dc:感谢分享!!!
  • 程序亦非猿:如果别人拿了你的代码 生成 app,说是他的 app ,你怎么反驳?

    这时候签名就是证据了~
  • 68768b474bfc:我还是不知道签名有什么用。。。android studio 的build菜单上build apk 和generate signed apk有什么区别
  • fendo:赞一个!!
  • c2958ac4133d:jarsigner -verbose -keystore test.keystore -signedjar signed.apk t.apk 'test'
    最后的别名参数不需要加引号
    6101fa3962e8:@程序亦非猿 windows 加了会出现 jarsigner:证书链未发现,aliasname必须引用有效密匙输入包含一个私有密匙和相应的公共密匙证书链。要怎样才能签名apk?
    程序亦非猿:@Viator42 恩 加了也没事
  • 2fb12fe3af87:我用这条命令签名jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.Keystore APPNAME.apk aliasname` ,而报错的是:jarsigner:证书链未发现,aliasname必须引用有效密匙输入包含一个私有密匙和相应的公共密匙证书链。要怎样才能签名apk?
    ac90cd96f51b:其实不用引号也可以
    c0bcade0ae3e:@6101fa3962e8 楼上正解
    6101fa3962e8:@奇酷 这是楼主埋下的坑, 单引号改为 双引号就好了。 我是window平台,估计 作者是 其它平台的
  • 小彤花园:居然是看的猿猿的,今天用到了
    程序亦非猿:@小彤花园 LOL~
  • 红绯鱼:keyforandroid
  • 空心菜的爱:咦?为啥没有用360签名这种第三方软件呢?
    程序亦非猿:@空心菜的爱 一般不太需要
  • bd0f8a1e9c96:动手总是需要勇气。干的漂亮
    程序亦非猿:@igeek 谢谢
  • 曾樑::+1::+1:
    程序亦非猿:@曾樑 这么快...

本文标题:Android给apk签名那点事

本文链接:https://www.haomeiwen.com/subject/frfbhttx.html