1、签名简介
1.1、签名的作用
1)系统签名
我们都知道编译eng版本的时候,用的是testkey,这种key只是研发阶段,而且这种密钥谁都可以使用。当发布release版本的时候,就需要release key ,防止别人盗用。
2)apk 签名
(1) 开发者的身份验证,由于开发商可能使用的package name 相同来混淆已经安装的程序,以此保证签名的不同,来保证apk 不会被替换。
(2)保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中每个内容不被替换。
3)recovery 签名的作用
recovery 签名主要是验证数据的完整性
1.2、签名简介
要对Android系统进行签名,需要生成四种类型的key文件
1)releasekey(testkey)
2)media
3)shared
4)platform
以上四种,可以在代码/build/target/product/security/里看到对应的密钥。
其中shared.pk8代表私钥
shared.x509.pem代表公钥 (一定成对出现)
其中testkey是android编译的时候默认的签名key,
2、生成key的步骤
2.1、生成key用到的工具
我们以releasekey为例,Android使用SHA1-RSA算法进行签名。我么可以在源码下/development/tools/make_key 来实现。
2.2、制作方法
例如:./make_key releasekey ‘/C=CN/ST=ShangHai/L=XuHui View/O=ThunderSoft/OU=MetorCar/CN=lumeng/emailAddress=lumeng0714@ThunderSoft@.com’
其实这是有两个参数:
1)releasekey 就是你要制作的上述四种Key的名字
1)releasekey(testkey)
2)media
3)shared
4)platform
2)下面一个是地址,公司,厂家,制作者的信息等
‘/C=CN/ST=JiangSu/L=ShangHai View/O=ThunderSoft/OU=MetorCar/CN=lumeng/emailAddress=lumeng0714@ThunderSoft@.com’
C=CN–>国家名字
ST=JiangSu–>省城市名字
L=ShangHai–>城市名字
View/O=ThunderSoft 公司名称
OU=MetorCar–> 部门名称或项目名称
CN=lumeng–>制作者名称
emailAddress=lumeng0714@ThunderSoft@.com–>制作者邮箱地址
3)制作的过程当中会让输入密码,此步直接enter跳过,要不然每次签名apk,还需要手动输入签名密码。
另外四种也同样方法生成,此时会生成如下八个文件:
其中.pk8是密钥,.x590.pem是公钥。
如果制作过程中出现错误,检查格式,使用sudo 权限。
3、如何签名
3.1、对apk进行签名
执行:
java -jar signapk.jar releasekey.x509.pem releasekey.pk8 input.apk output.apk
(signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到。)
如果apk的android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。如果设置:LOCAL_CERTIFICATE=platform就代表使用platform来签名,这样的话apk就有了和system相同的签名,因为系统级别的签名也是使用platform来签名,此时需要添加代码:
android:sharedUserld=”android.uid.system”才有用。
签名后,输出文件的meta_inf目录下生长出如下文件
MANIFEST.MF:对分文件夹非签名文件的文件,逐个生成SHA1的数字签名信息
CERT.SF:对Manifest文件,使用SHA1-RSA算法,用私钥进行签名。
CERT.RSA:CERT.RST文件中保存了公钥、所采用的加密算法等信息。
3.2、对OTA升级release key的替换
1)首先在build/core/ 里面搜索testkey,查看testkey怎么用到的编译系统,
grep -nir “testkey”
我们可以看到 在Makefile 文件,以及config.mk 文件里面都会含有搜索字段
在/build/core/Makefile里面
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey)
BUILD_KEYS := test-keys
else
BUILD_KEYS := dev-keys
我们追踪DEFAULT_SYSTEM_DEV_CERTIFICATE
/build/core/config.mk
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif
我们在追踪PRODUCT_DEFAULT_DEV_CERTIFICATE
要使用releasekey我们只需要修改
/device/平台名/项目名$项目名.mk
中添加或指定
PRODUCT_DEFAULT_DEV_CERTIFICATE的值:
DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey (release的路径)
同时修改,build/core/Makefile内容:
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)
BUILD_KEYS := release-keys
endif
4、如何验证签名
倘若签名不同,会安装不了apk 和完成升级。
对与公钥和密钥的差别大家可以看这个博客:
文献参考:
1、Android OTA releasekey 替换
2、android系统release签名
3、生成release版本的Android系统 –签名
http://blog.163.com/yi_yixinyiyi/blog/static/136286889201132533759563/
4、Android——编译release版签名系统