全部博文(153)
分类: LINUX
2011-01-25 13:28:15
本文转自作者:xy0811 ,很强大,谢谢共享。
1)
发送者的身份认证
2)
保证信息传输的完整性
3)
防止交易中的抵赖发生,
Market
对软件的要求
2.
签名的说明
1)
所有的应用程序都必须有数字证书,
Android
系统不会安装一个没有数字证书的应用程序
2)
Android
程序包使用的数字证书可以是自签名的,不需要一个权威
的数字证书
机构签名认证
3)
如果要正式发布一个
Android
应用,必须使用一个合适的私钥生成的数字证书来给程序
签名,而不能使用
adt
插件或者
ant
工具生成的调试证书来发布
4)
数字证书都是有有效期的,
Android
只是在应用程序安装的时候才会检查证书的有效期。如果
程序已经安装在系统中,即使证书过期也不会影响程序的正
常功能
5)
签名后需使用
zipalign
优化程序
6)
Android
将数字证书用来标识应用程序的作者和在应用程序之间建
立信任关
系,而不是用来决定最终用户可以安装哪些应用程序
3.
签名的方法
1)
用
eclipse
插件方式签名
a)
调试签名
b)
开发者生成密钥并签名
c)
开发者导出未签名的包
2)
用命令行方式签名
a)
生成签名
b)
为
apk
文件签名
c)
看某个
apk
是否经过了签名
d)
优化(签名后需要做对齐优化处理)
3)
在源码中编译的签名
a)
使用源码中的默认签名
b)
在源码中自签名
c)
mkkey.sh
介绍
i.
生成公钥
ii.
转成
x509
格式(含作者有效期等)
iii.
生成私钥
4.
签名的相关文件
1)
apk
包中签名相关的文件在
META_INF
目录下
2)
相关源码
5.
签名的相关问题
1)
两个应用,名字相同,签名不同
2)
升级时前一版本签名,后一版本没签名
3)
升级时前一版本为
DEBUG
签名,后一个为自定义签名
4)
升级时前一版本为
Android
源码中的签名,后一个为
DEBUG
签名或自定义签名
5)
安装未签名的程序
6)
安装升级已过有效期的程序
6.
相关工具
1)
查看某个
x509
证书的的有效日期
7.
参考
1.
为什么要签名
由于开发商可能通
过使用相同的
Package Name
来混淆替换已经安装的程序,以此保证签名不同的包不被
替换
签名对于包中的每
个文件进行处理,以此确保包中内容不被替换
eclipse
插件默认赋予程序一
个
DEBUG
权限的签名,此签名的程序不能发布到
market
上,此签名有效期为一年,如果过期则导致你无法生成
apk
文件,此时你只要删除
debug
keystore
即可,
系统又会为你生成有效期为一年的新签名
右键点击项目名,
在菜单中选择
Android Tools
,然后选择
Export
Signed Application Package…
,即可通过
eclipse
自定义证书并签名
右键点击项目名,
在菜单中选择
Android Tools
,然后选择
Export
Signed Application Package…
,即可导出未签名的包,之后可通过命令行方式签名
使用标准的
java
工具
keytool
和
jarsigner
来生成证书和给程序签名
$ keytool -genkey
-keystore keyfile -keyalg RSA -validity 10000 -alias yan
注:
validity
为天数,
keyfile
为生成
key
存放的文件,
yan
为私钥,
RSA
为指定的加密算法
(
可用
RSA
或
DSA)
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk
base.apk yan
注:
keyfile
为生成
key
存放的文件,
signed.apk
为签名后的
apk
,
base.apk
为未签
名的
apk
,
yan
为私钥
$ jarsigner -verify my_application.apk
$ zipalign -v 4 your_project_name-unaligned.apk
your_project_name.apk
在源码中编译一般
都使用默认签名的,在某源码目录中用运行
$ 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.
Android
提供了一个脚本
mkkey.sh
(
build/target/product/security/mkkey.sh
),用于生成密钥,生成后在应用程序中通过
Android.mk
中的
LOCAL_CERTIFICATE
字段指名用哪个签名
openssl genrsa -3 -out testkey.pem 2048
其中
-3
是算法的参数,
2048
是密钥长度,
testkey.pem
是输出的文件
openssl req -new -x509 -key testkey.pem -out
testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=Mountain
’
openssl pkcs8 -in testkey.pem -topk8 -outform DER
-out testkey.pk8 -nocrypt
把的格式转换成
PKCS
#8
,这里指定了
-nocryp
,表示不加密,所以签名时不用输入密码
CERT.SF
:生成每个文件相对的密钥
MANIFEST.MF
:数字签名信息
xxx.SF
:这是
JAR
文件的签名文件,占位符
xxx
标识了签名者
xxx.DSA
:对输出文件的签名和公钥
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/*
一般在安装时提示
出错:
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
在
SignApk.java
中打印出
publicKey.getNotAfter()
即可
http://developer.android.com/guide/publishing/app-signing.html
http://pepa.javaeye.com/blog/250991