现在,我们介绍Android APK的签名与重签名的一些要点
APK实际上是一个ZIP压缩文件
解压缩后有个META-INF目录
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。
安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。
每一个Android应用程序必须要有数字签名才能安装.
有两种方法:
一种是使用调试密钥(可以在模拟器或者设备上做调试时使用),
还有一种就是私钥(为应用程序发布用).当组建Adriod应用程序时组建工具会自动为应用程序提供签名,
但是如果想发布应用程序的时候,必须使用自己的私钥.
编译时使用Release模式 需要手工添加签名.只有有签名的应用程序才可以安装.
签名工具;来自开源软件
Keytool
创建一个密钥证书存储文件和一个私钥,用来为.apk文件签名
Jarsigner (类似的签名工具)
用Keytool产生的私钥为.apk文件签名
使用Auto-sign工具重新对其进行签名即可,首先,删掉META-INF文件夹下的签名文件
CERT.SF
CERT.RSA
从文件名就可以看出 cert.rsa 是 证书的rsa公钥
替换原来apk包中的classes.dex, 在GNOME 的归档管理器 中拖进去即可, windows 资源管理器,其它压缩软件也可支持拖拉.
SignApk.jar is a tool included with the Android platform source bundle.
testkey.pk8 is the private key that is compatible with the recovery image included in this zip file
testkey.x509.pem is the corresponding certificate/public key
Usage:
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update_signed.zip
也可直接用以下命令:
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
在哪里找到这些东西
/build/target/product/security/目录下面的platform.pk8和platform.x509.pem两个文件
签名工具在 /build/tools/signapk/signapk.jar
或者是由 /build/tools/signapk/signapk.java 经过编译生成在/out/host/linux-x86/framework/signapk.jar
据说签名时 不必要删除原来的CERT.SF和CERT.RSA, 会自动替换掉的
http://gbs-ben.googlecode.com/files/Auto-sign.rar
http://file.geeka.net/Android/tools/Auto-sign.rar
在sun-java6-jdk 中包含有一个签名工具
/usr/lib/jvm/java-6-sun-1.6.0.22/bin/jarsigner
在openjdk-6-jdk 也有一个签名工具
/usr/lib/jvm/java-6-openjdk/bin/jarsigner
验证签名
/usr/lib/jvm/java-6-sun-1.6.0.22/bin/jarsigner -verify /tmp/zhiwei.li.apk
/usr/lib/jvm/java-6-sun-1.6.0.22/bin/jarsigner -verbose -certs -verify /tmp/zhiwei.apk 会输出详细的信息(输出详细信息和验证时显示证书)
在 sun-java6-bin 有一个创建数字证书的工具
/usr/lib/jvm/java-6-sun-1.6.0.22/bin/keytool
/usr/lib/jvm/java-6-sun-1.6.0.22/jre/bin/keytool
openjdk-6-jre-headless
/usr/lib/jvm/java-6-openjdk/bin/keytool
/usr/lib/jvm/java-6-openjdk/jre/bin/keytool
/usr/lib/jvm/java-6-sun-1.6.0.22/bin/keytool -genkeypair -alias zhiwei.keystore -keyalg RSA -validity 11911 -keystore zhiwei.keystore
用 /usr/lib/jvm/java-6-sun-1.6.0.22/bin/jarsigner -verify -verbose -certs 选项可以查看详细的验证信息
比如证书的有效时间, 用keytool生成的证书, 据说有效时间应该在2030年之后才可以在android上运行
调试签名的位置
debug.keystore 默认位置在 ~/.android/目录
Keystore name: “debug.keystore”
Keystore password: “android”
Key alias: “androiddebugkey”
Key password: “android”
CN: “CN=Android Debug,O=Android,C=US”