Android APK的签名与重新签名

时间:2024-02-20 16:31:24

原文地址: http://zhiwei.li/text/2010/12/android-apk%E7%9A%84%E7%AD%BE%E5%90%8D%E4%B8%8E%E9%87%8D%E6%96%B0%E7%AD%BE%E5%90%8D/

 

今年年初的时候,介绍了
BlackBerry系统和签名
从BlackBerry应用程序中移除签名以及重新签名
使用BlackBerry代码签名工具

现在,我们介绍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

在哪里找到这些东西
build\target\product\security目录下面的platform.pk8和platform.x509.pem两个文件

签名工具在 build\tools\signapk\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”