博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android签名
阅读量:4067 次
发布时间:2019-05-25

本文共 2247 字,大约阅读时间需要 7 分钟。

1.  为什么要签名 

    1)  发送者的身份认证
         由于开发商可能通过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换
    2)  保证信息传输的完整性
         签名对于包中的每个文件进行处理,以此确保包中内容不被替换
    3)  防止交易中的抵赖发生, Market 对软件的要求
2.   签名的说明 
    1)  所有的应用程序都必须有数字证书, Android 系统不会安装一个没有数字证书的应用程序
    2)  Android 程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
    3)  如果要正式发布一个 Android 应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用 adt 插件或者 ant 工具生成的调试证书来发布
    4)  数字证书都是有有效期的, Android 只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能
    5)  签名后需使用 zipalign 优化程序
    6)  Android 将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序
3.   签名的方法

4.  签名的相关文件
 

1)         apk 包中签名相关的文件在 META_INF 目录下 

CERT.SF :生成每个文件相对的密钥 
MANIFEST.MF 
:数字签名信息 
xxx.SF 
:这是 JAR 文件的签名文件,占位符 xxx 标识了签名者 
xxx.DSA 
:对输出文件的签名和公钥

2)         相关源码 

development/tools/jarutils/src/com.anroid.jarutils/SignedJarBuilder.java
frameworks/base/services/java/com/android/server/PackageManagerService.java
frameworks/base/core/java/android/content/pm/PackageManager.java
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
dalvik/libcore/security/src/main/java/java/security/Sign*
build/target/product/security/platform.*
build/tools/signapk/*

5.  签名的相关问题

 

 

 

一般在安装时提示出错: INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

1)         两个应用,名字相同,签名不同

2)         升级时前一版本签名,后一版本没签名

3)         升级时前一版本为 DEBUG 签名,后一个为自定义签名

4)         升级时前一版本为 Android 源码中的签名,后一个为 DEBUG 签名或自定义签名

5)         安装未签名的程序

6)         安装升级已过有效期的程序

6.  相关工具 

7.  参考 

 

1)         查看某个 x509 证书的的有效日期 

 SignApk.java 中打印出 publicKey.getNotAfter() 即可

 

a)          使用源码中的默认签名 

在源码中编译一般都使用默认签名的,在某源码目录中用运行 
$ mm showcommands 
能看到签名命令 
Android 
提供了签名的程序 signapk.jar ,用法如下: 
$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar 
*.x509.pem 
 x509 格式公钥, pk8 为私钥 
build/target/product/security 
目录中有四组默认签名可选: testkey, platform, shared, media (具体见 README.txt ),应用程序中 Android.mk 中有一个 LOCAL_CERTIFICATE 字段,由它指定用哪个 key 签名,未指定的默认用 testkey.

b)         在源码中自签名 

Android 提供了一个脚本 mkkey.sh  build/target/product/security/mkkey.sh ),用于生成密钥,生成后在应用程序中通过Android.mk 中的 LOCAL_CERTIFICATE 字段指名用哪个签名

c)          mkkey.sh 介绍

                                       i.              生成公钥 

openssl genrsa -3 -out testkey.pem 2048 
其中 -3 是算法的参数, 2048 是密钥长度, testkey.pem 是输出的文件

                                      ii.              转成 x509 格式(含作者有效期等) 

openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=Mountain

                                    iii.              生成私钥 

openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt 
把的格式转换成 PKCS #8 ,这里指定了 -nocryp ,表示不加密,所以签名时不用输入密码

转载地址:http://knaji.baihongyu.com/

你可能感兴趣的文章
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
概念区别
查看>>
Jenkins 启动命令
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
Android/Linux 内存监视
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
剑指offer算法题分析与整理(三)
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
QT打开项目提示no valid settings file could be found
查看>>
android 代码实现圆角
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>