1) 發送者的身份認證
因爲開發商可能經過使用相同的Package Name來混淆替換已經安裝的程序,以此保證簽名不一樣的包不被替換html
2) 保證信息傳輸的完整性
簽名對於包中的每一個文件進行處理,以此確保包中內容不被替換java
3) 防止交易中的抵賴發生,Market對軟件的要求android
2. 簽名的說明算法
1) 全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序app
2) Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證eclipse
3) 若是要正式發佈一個Android應用,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布ide
4) 數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能工具
5) 簽名後需使用zipalign優化程序優化
6) Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,而不是用來決定最終用戶能夠安裝哪些應用程序ui
3. 簽名的方法
1) 用eclipse插件方式簽名
a) 調試簽名
eclipse插件默認賦予程序一個DEBUG權限的簽名,此簽名的程序不能發佈到market上,此簽名有效期爲一年,若是過時則致使你沒法生成apk文件,此時你只要刪除debug keystore便可,系統又會爲你生成有效期爲一年的新簽名
b) 開發者生成密鑰並簽名
右鍵點擊項目名,在菜單中選擇Android Tools,而後選擇Export Signed Application Package…,便可經過eclipse自定義證書並簽名
c) 開發者導出未簽名的包
右鍵點擊項目名,在菜單中選擇Android Tools,而後選擇Export Signed Application Package…,便可導出未簽名的包,以後可經過命令行方式簽名
2) 用命令行方式簽名
使用標準的java工具keytool和jarsigner來生成證書和給程序簽名
a) 生成簽名
$ keytool -genkey -keystore keyfile -keyalg RSA -validity 10000 -alias yan
注:validity爲天數,keyfile爲生成key存放的文件,yan爲私鑰,RSA爲指定的加密算法(可用RSA或DSA)
b) 爲apk文件簽名
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan
注:keyfile爲生成key存放的文件,signed.apk爲簽名後的apk,base.apk 爲未簽名的apk,yan爲私鑰
c) 看某個apk是否通過了簽名
$ jarsigner -verify my_application.apk
d) 優化(簽名後須要作對齊優化處理)
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
3) 在源碼中編譯的簽名
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 View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com’
iii. 生成私鑰
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式轉換成PKCS #8,這裏指定了-nocryp,表示不加密,因此簽名時不用輸入密碼
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. 相關工具
1) 查看某個x509證書的的有效日期
在SignApk.java中打印出publicKey.getNotAfter()便可
7. 參考
http://developer.android.com/guide/publishing/app-signing.html
http://www.pgcw.com.cn/Newsdetail.asp?id=257565010
http://www.eoeandroid.com/thread-23010-1-1.html
http://pepa.javaeye.com/blog/250991