android apk簽名(為什麼 如何做 驗證)

來源:互聯網
上載者:User

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/emailAddress=android@android.com]View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com[/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版本來解決。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.