android apk簽名(為什麼 如何做 驗證)
這篇文章其實就是根據自己的疑問然後結合多個文章結合成的
文章引用:
http://liangxh2008.blog.163.com/blog/static/112411679201041321646855/
http://www.pgcw.com.cn/Newsdetail.asp?id=257565010
http://www.eoeandroid.com/thread-23010-1-1.html
http://pepa.iteye.com/blog/250991
http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=36678
http://blog.csdn.net/wenhaiyan/archive/2010/04/23/5520964.aspx
http://jojol-zhou.iteye.com/blog/719428
一、為什麼要簽名:
1、發送者的身份認證,由于開發商可能通過使用相同的Package Name來混淆替換已經安裝的程式,以此保證簽名不同的包不被替換
2、保證資訊傳輸的完整性,簽名對于包中的每個檔案進行處理,以此確定包中内容不被替換,防止交易中的抵賴發生,Market對軟體的要求
二、簽名的說明:
1、所有的應用程式都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程式
2、Android程式包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
3、如果要正式釋出一個Android應用,必須使用一個合适的私鑰生成的數字證書來給程式簽名,而不能使用adt插件或者ant工具生成的調試證書來釋出
4、 數字證書都是有有效期的,Android隻是在應用程式安裝的時候才會檢查證書的有效期。如果程式已經安裝在系統中,即使證書過期也不會影響程式的正常功能
5、簽名後需使用zipalign優化程式
6、Android将數字證書用來辨別應用程式的作者和在應用程式之間建立信任關系,而不是用來決定最終使用者可以安裝哪些應用程式
三、簽名的方法:
1、 用eclipse插件方式簽名
2、 調試簽名
eclipse插件預設賦予程式一個DEBUG權限的簽名,此簽名的程式不能釋出到market上,此簽名有效期為一年,如果過期則導緻你無法生成apk檔案,此時你隻要删除debug keystore即可,系統又會為你生成有效期為一年的新簽名
b) 開發者生成密鑰并簽名
右鍵點選項目名,在菜單中選擇Android Tools,然後選擇Export Signed ApplicationPackage…,即可通過eclipse自定義證書并簽名
c) 開發者導出未簽名的包
右鍵點選項目名,在菜單中選擇Android Tools,然後選擇Export Signed ApplicationPackage…,即可導出未簽名的包,之後可通過指令行方式簽名
3、用指令行方式簽名
使用标準的java工具keytool和jarsigner來生成證書和給程式簽名
a) 生成簽名
$ keytool -genkey -keystorekeyfile -keyalg RSA -validity 10000 -aliasyan
注:validity為天數,keyfile為生成key存放的檔案,yan為私鑰,RSA為指定的加密算法(可用RSA或DSA)
b) 為apk檔案簽名
$ jarsigner -verbose -keystorekeyfile -signedjar signed.apk base.apkyan
注:keyfile為生成key存放的檔案,signed.apk為簽名後的apk,base.apk 為未簽名的apk,yan為私鑰
c) 看某個apk是否經過了簽名
$ jarsigner –verify my_application.apk
例如:jarsigner -verify -verbose -certs abc.apk
每個簽名的apk都會看到如下資訊
sm 152412 Wed Oct 14 14:16:52 CEST 2009 classes.dex
X.509, CN=Meebo, OU=Meebo, O=Meebo, L=Mountain View, ST=California, C=US
[certificate is valid from 28/10/08 06:49 to 13/08/82 07:49]
否則就是沒有簽名
d) 優化(簽名後需要做對齊優化處理)
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
4、在源碼中編譯的簽名
a) 使用源碼中的預設簽名
在源碼中編譯一般都使用預設簽名的,在某源碼目錄中用運作
$ mmshowcommands能看到簽名指令
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 -outtestkey.pem 2048
其中-3是算法的參數,2048是密鑰長度,testkey.pem 是輸出的檔案
ii. 轉成x509格式(含作者有效期等)
openssl req -new -x509 -keytestkey.pem -out testkey.x509.pem -days 10000 -subj‘/C=US/ST=California/L=Mountain [email=View/O=Android/OU=Android/CN=Android/[email protected]]View/O=Android/OU=Android/CN=Android/[email protected][/email]’
iii. 生成私鑰
openssl pkcs8 -in testkey.pem-topk8 -outform DER -out testkey.pk8-nocrypt
把的格式轉換成PKCS #8,這裡指定了-nocryp,表示不加密,是以簽名時不用輸入密碼
四、簽名的相關檔案
1) apk包中簽名相關的檔案在META_INF目錄下
CERT.SF:生成每個檔案相對的密鑰
MANIFEST.MF:數字簽名資訊
xxx.SF:這是JAR 檔案的簽名檔案,占位符 xxx辨別了簽名者
xxx.DSA:對輸出檔案的簽名和公鑰
2)相關源碼
五、簽名的相關問題
一般在安裝時提示出錯:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
1) 兩個應用,名字相同,簽名不同
2) 更新時前一版本簽名,後一版本沒簽名
3) 更新時前一版本為DEBUG簽名,後一個為自定義簽名
4) 更新時前一版本為Android源碼中的簽名,後一個為DEBUG簽名或自定義簽名
5) 安裝未簽名的程式
6) 安裝更新已過有效期的程式
6. 相關工具
1) 檢視某個x509證書的的有效日期
簽名具體步驟:
Apk簽名首先要有一個keystore的簽名用的檔案.
keystore是由jdk自帶的工具keytool生成的.具體生成方式參考一下:
開始->運作->cmd->cd 到你安裝的jdk的目錄這裡我是 C:/Program Files/Java/jdk1.6.0_10/bin
然後輸入:keytool -genkey -alias asaiAndroid.keystore -keyalg RSA -validity 20000 -keystore asaiAndroid.keystore
-alias 後跟的是别名這裡是 asaiAndroid.keystore
-keyalg 是加密方式這裡是 RSA
-validity 是有效期 這裡是 20000
-keystore 就是要生成的keystore的名稱 這裡是 asaiAndroid.keystore
然後按回車
按回車後首先會提示你輸入密碼:這個在簽名時要用的要記住了哦。
然後會再确認你的密碼。
之後會依次叫你輸入 姓名,組織機關,組織名稱,城市區域,省份名稱,國家代碼等。
參考:
運作完可以在 C:/Program Files/Java/jdk1.6.0_10/bin 裡找到剛才生産的keyStore檔案
好現在開始給Apk簽名了:
在 C:/Program Files/Java/jdk1.6.0_10/bin 還提供一個工具 jarsigner.exe
好現在可以在剛才的指令行後繼續運作以下指令給APK簽名:
jarsigner -verbose -keystore asaiAndroid.keystore -signedjar LotteryOnline_signed.apk LotteryOnline.apk asaiAndroid.keystore
-keystore:keystore 的名稱
LotteryOnline_signed.apk 是簽完名後的APK
LotteryOnline.apk 是簽名前的apk
然後按回車:會要求輸入剛才設定的密碼,輸入後按回車就開始簽名了。
參考:

運作成功後在 C:/Program Files/Java/jdk1.6.0_10/bin 目錄下會多出一個被簽名的apk檔案,
參考:
如果這種方法不行,可以試試eclipse自帶的方法,也是引用“竊”别人的文章^-^
1.Eclipse工程中右鍵工程,彈出選項中選擇 android工具-生成簽名應用包:
2.選擇需要打包的android項目工程:
3.如果已有私鑰檔案,選擇私鑰檔案 輸入密碼,如果沒有私鑰檔案見 第6和7步建立私鑰檔案:
4.輸入私鑰别名和密碼:
5.選擇APK存儲的位置,并完成設定 開始生成:
6.沒有私鑰檔案的情況,建立私鑰檔案:
7.輸入私鑰檔案所需資訊,并建立:
補充:
如果需要最終發行你的android程式,必需為apk檔案簽名。這裡apk和jar的簽名方式都是一樣的,使用sun jdk的jarsigner工具來完成,但是執行時會提示jarsigner: 無法對 jar 進行簽名: java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes)這樣的提示,
這些問題主要是由于資源檔案造成的,對于android開發來說應該檢查res檔案夾中的檔案,逐個排查。這個問題可以通過更新系統的JDK和JRE版本來解決。