【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 進行APK檔案的簽名,以及keystore檔案的使用

來源:互聯網
上載者:User

標籤:android   style   blog   class   code   java   

你看到的這個文章來自於http://www.cnblogs.com/ayanmw

 

一個android apk的編譯過程 請參考:

http://www.2cto.com/kf/201312/261475.html

典型的編譯過程:aapt( Android Asset Packaging Tool): 把你的應用程式資源檔(例如: AndroidManifest.xml file and the XML files for your Activities),編譯成R.java 。它可以讓你從java代碼中引用你的資源。aidl :轉換.aidl 介面成為java介面java編譯工具(javac):所有的java代碼(包括 :java源碼,R.java , .aidl 轉換後的介面檔案)由java編譯工具(javac) 編譯成中間代碼(.class) 檔案。dex工具(dx):轉換中間代碼和第三方庫的中間代碼為Dalvik byte codeapk建立工具:把所有不需要編譯的資源,編譯的資源和Dalvik代碼(.dex)打包成 .apk 檔案簽名(jarsigner).apk 建立後,它必須被簽名才能安裝到裝置上,否則裝置會拒絕安裝。因為編譯工具包含了調試簽名的私密金鑰,所以在編譯時間就直接簽名了。但是你要發行版本時,你必須自己對apk包進行簽名。對齊工具(zipalign):最後,還需要用zipalign工具對包進行對齊。

 

安裝JDK,確保可以使用keytool jarsigner兩個工具,因為apk格式其實就是jar,jar又是基於zip格式 添加一些擴充內容的格式.

1.製作簽名工具
C:\>where keytool
C:\Program Files\Java\jdk1.7.0_45\bin\keytool.exe
2.進行簽名工具
C:\>where jarsigner
C:\Program Files\Java\jdk1.7.0_45\bin\jarsigner.exe

 

簽名分兩個部分:

產生私密金鑰

keytool:

 

Keytool 選項 描述
-genkey 產生一個索引值對(公開金鑰和私密金鑰)
-v 允許動作輸出
-alias<alias_name> 鍵的別名。只有前八位字元有效。
-keyalg 產生鍵的密碼編譯演算法。支援DSA和RSA。
-keysize 產生鍵的長度。如果不支援,keytool用預設值1024 bits.通常我們用2048 bits 或更長的key。
-dname

專有名稱,描述誰建立的密鑰。該值被用作自我簽署憑證的頒發者和主題欄位。注意你可以不在命令列指定。如果沒有指定keytool會提示你(CN, OU, and so on)。

-keypass

鍵的密碼。

主要為了安全起見,如果沒提供,keytool會提示你輸入。

-validity

鍵的有效期間,單位:天

Note: A value of 10000 or greater is recommended.

-keystore.keystore 用於儲存私密金鑰的檔案。
-storepass

私密金鑰隱藏檔的密碼。

主要為了安全起見,如果沒提供,keytool會提示你輸入。這個密碼不會儲存在你的shell記錄中。

keytool -genkey -v -keyalg DSA -keysize 1024 -sigalg SHA1withDSA  -validity 20000  -keystore MyDevel.keystore -alias devel   -keypass MyDevel -storepass MyDevel

用私密金鑰進行簽名

jarsigner:

 

Jarsigner 選項 描述
-keystore.keystore 包含你私密金鑰的隱藏檔
-verbose 顯示輸出動作。
-sigalg 簽名演算法,用 SHA1withRSA.
-digestalg 訊息摘要演算法,用 SHA1.
-storepass

隱藏檔的密碼。

主要為了安全起見,如果沒提供,jarsigner會提示你輸入。這個密碼不會儲存在你的shell記錄中。

-keypass

私密金鑰的密碼。

主要為了安全起見,如果沒提供,jarsigner會提示你輸入。這個密碼不會儲存在你的shell記錄中。

jarsigner  -verbose -sigalg SHA1withDSA -digestalg SHA1  -keystore myDevel.keystore -storepass MyDevel test.apk devel

 

 

用eclipse工具進行簽名:

在工程上點右鍵->android tools->export singedappplication package

 

用已經存在的keystore KEY隱藏檔簽名:

也可以建立一個新的keystore檔案:

 這裡validity 年的有效期間為1-1000哦..其他就錯了,改成500試試.

同樣是MyDevel.keystore,一個是jarsigner簽名,一個是eclipse簽名。

 

對齊工具(zipalign):

一旦你已經簽署了APK與你的私密金鑰,在檔案上運行zipalign。此工具可確保所有未壓縮的資料開始於一個特定的位元組對齊,相對於檔案的開始。當一個裝置上安裝,確保對齊在4位元組邊界提供了效能最佳化。當對齊,Android系統能夠讀取檔案使用mmap(),即使它們包含與對齊限制位元據,而不是複製所有從包中的資料的。其好處是在RAM中的運行應用程式所消耗的量減少。

zipalign -v 4 HelloWorld.apk HelloWorld_Release.apk

 

 

 

=========================================

在使用jarsigner簽名的時候,遇到無法安裝,提示無簽名的錯誤:

正常的安裝應該是:

C:\>adb install test.apk360 KB/s (19576 bytes in 0.053s)        pkg: /data/local/tmp/test.apkSuccess

如果已經安裝,adb貌似無法直接覆蓋安裝

C:\>adb install test.apk367 KB/s (19576 bytes in 0.052s)        pkg: /data/local/tmp/test.apkFailure [INSTALL_FAILED_ALREADY_EXISTS]

對於【沒有簽名或簽名有錯誤】的安裝為

C:\>adb install test_Unsigned.apk315 KB/s (18113 bytes in 0.056s)        pkg: /data/local/tmp/test_Unsigned.apkFailure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

其他人也遇到過這個問題:如這位兄弟所言

JDK1.7簽名APK異常 http://blog.csdn.net/sgz_china/article/details/8060315

錯誤的簽名為:

C:\>jarsigner  -verbose  -keystore myDevel.keystore -storepass MyDevel test.apk devel   正在添加: META-INF/DEVEL.SF   正在添加: META-INF/DEVEL.DSA  正在簽名: res/layout/main.xml  正在簽名: AndroidManifest.xml  正在簽名: resources.arsc  正在簽名: res/drawable-hdpi/icon.png  正在簽名: res/drawable-ldpi/icon.png  正在簽名: res/drawable-mdpi/icon.png  正在簽名: classes.dex
C:\>adb install test.apk349 KB/s (19697 bytes in 0.055s)        pkg: /data/local/tmp/test.apkFailure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]C:\>

主要是去掉了 jarsigner的兩個參數:  -sigalg SHA1withDSA -digestalg SHA1 

其實在Android官網有說明的:

http://developer.android.com/tools/publishing/app-signing.html#setup 

Caution: As of JDK 7, the default signing algorithim has changed, requiring you to specify the signature and digest algorithims (-sigalg and -digestalg) when you sign an APK.
jarsigner  -..... -sigalg SHA1withRSA -digestalg SHA1 ...

JDK1.7 由於預設簽名演算法改變,需要指定 簽名演算法 和 密鑰  演算法.應該是對應keytool的

-sigalg <sigalg>簽名演算法名稱

-keyalg <keyalg> 密鑰演算法名稱

兩個參數.

 

===============

另外關於簽名後的META-INFO中的 SF RSA檔案名稱

不過預設的APK的META-INFO的簽名後的檔案名稱是 CERT.SF 和 CERT.RSA. 我使用jarsigner 簽名後 就是 那個 <alias>.SF <alias>.RSA。;用eclipse簽名的就是這種命名。

這個CERT應該不是keytool指定的alias吧? 可以通過其他方式改成這個名字嗎?不知道,直接修改apk,那麼apk的zip頭資訊中的簽名資訊將會被修改掉,導致無法安裝了。

 

======================

TODO:關於APK簽名,還有一種是Android源碼中的 signapk.jar [編譯 打包後,有SignApk.java的源碼檔案的]

使用方法:

Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

 

其中

testkey.pk8 是二進位,

0?? 0    *咹嗺 ???? ? 謸奩$表莃噘?>>蚻??尐杓ㄍk觴n????Y?w〤玷=Kd鎬漁V疋g?坎0祒?C綥r窮?嗮8壜?幘蠌拭??申撔躂驪"P2鄝?頹3Y姒旍,瞅劆葄斬;1    :g7./d纍mB馲唼佁訢趌菝?XH?dO哭樕(wH塒gjT乀然?光GU3膋汍o撳處i縟⑿巟& ?檙}<?欉洰8牪?[j? ?籜攧m梭贏?錸)3濖颯]硼}呸G釶I謀捏D    ?f#慤;~鷓罪?茼袠┝鈾廗霦?v?ブ瓊~蕁e?NY鮷4[?z?5?<梪堖糞o阻1鮳羄5Z痺@U?鬍uy???v銷X6≮ud?┛??)錳楛j襸櫑鼔w襡L氌|u;溭Ldg庤鼼k~餉~昗漰Do珦?玣J蓸??+R六抨d顒?I??x?H?蹽v宿柦L{亖 昀?洉‘?繛桬匴憊灖?齪撪吱H魔﹁á贇hgk3掘樆M汎禱?F?,蛅v瓴酛w掔 祿*鱃韝wU?柏#v媂j駖m凝@?厙o_,交啛!y玌pzu{a?亖 輞?4ǒ7欑珬漗u柇嶢fI?洧?/b$4M+垑┨濏Go0.躈鎇陊綉蝠L?4??D(郩[葡N?aC~ |硭綴彵K2`MA62r?)?e"乫7~疑?\洀?崤慇?亖 渶fhg概*i?X??rb曚p0??餻l憣餌?Le???襰l/Mr葓鳲G!g雴?歴鵘蝏ぺ?O嶼\u錡l葫?聆R筘ㄕ舉i甖J?\右Y縦8蹌鍽'杇亖 ?Of#zf?re?9?鷥鉦筯榣sZ?Amx3r[茍iH贘 =夘珩?鱆?x|y{偱[email protected]繯邏虼@磚UW噁~鎋藝d藹3€翁LνqE狢h? 釹┽叟f?_梟A.?3亐c*蕒b贂b[桐F!糸Ys顝?雚×??症塽?j{雗Ua礎,`¥i飠wX+5區U狗l氏纖HEE/便麣h拍I?鱗;喳亙)4v広z????{塭邚鬄?

使用winhex複製16進位為:

308204BD020100300D06092A864886F70D0101010500048204A7308204A30201000282010100D6931904DEC60B24B1EDC762E0D9D8253E3ECD6CEB1DE2FF068CA8E8BCA8CD6BD3786EA70AA76CE60EBB0F993559FFD93E77A943E7E83D4B64B8E4FEA2D3E656F1E267A81BBFB230B578C20443BE4C7218B846F5211586F038A14E89C2BE387F8EBECF8FCAC3DA1EE330C9EA93D0A7C3DC4AF350220D50080732E0809717EE6A053359E6A694EC2CB3F284A0A466C87A94D83B31093A67372E2F6412C06E6D42F15818DFFE0381CC0CD444DA6CDDC3B82458194801B32564134FBFDE98C9287748DBF5676A540D8154C8BBCA07B9E247553311C46B9AF76FDEECCC8E69E7C8A2D08E782620943F99727D3C04FE72991D99DF9BAE38A0B2177FA31D5B6AFEE91F02010302820101008F0CBB589484076DCBF3DA41EB3BE56E297F339DF213ECAA045DC5F07DC5DE47E25049C4B1C4F34409D20A662391553B7EFA70D7EFF028DCEDD098A9C1E2998F4BEC451ABD2A76CB23A5D6AD827EDDA165D02F4E160E59F57B16345BD7297AFFB47F350A872D3C149775DBF1B7E06FD7E831F78AC15E355AAF774055BA0FF44575A286798E35C533B40276E44E5836A1DA7564ADFAF538A493A9BF10F213A657AC12291C1BE56997FC6AD27B99A7FC8977D2654CEBAA7C753B9CDA4C64671A8EE8FD476B7EE2C37E95579D70441E6FAB93A413AB664AC998FA25943F2B52C1F9C5EA64EF4A1BCA0149E717A214017896080C48A407DC4776CBDE96BD4CA1847B02818100EAC099171C9B95278C07BF9E974518855791769EA7B52BF6BA93E0D6A848C4A70D18A6E8A8A2DA5368676B33BEF298BB144D9AF8B5BBAD2246F42C2CCD7476EAB21BE14A771F92E7ADF600B5932AF747F7B9775587110AB0D8032318768B586AF17C6DC4FD40A8181E85876F5F0A2CBDBB03869F2179AB5570A7597A757B619B02818100E9FEF71934A8AF3799E712AB979D5E027596AD8D69156649961CE4A2AD082F186224344D2B888914A9CC9DED476F302EDC4EE65BEA77BD91F2F04C3F34BA09B6394428FBB4E0555BC6CF4EEC0E61437E00037CEDCB19BE598FB14B1732604D41363272FA3429E87F651D11228166377ED2C9A8190B5C9B8FDD2DE1C5029140CD028181009C80660F6867B8C508052A69BA2E1058E50BA469C52372A47C6295E47030831A08BB19F0706C918CF044F2227F4C65D20D8911FB23D2736C2F4D72C888F84F472167EB86FA150C9A73F955CE621CA4DAA5264F8E5A0B5C75E5576CBAF9B23AF1F652F3D8A8D5C56569AE5A4A3F5C1DD3D20259BF6BA67238F5C4E651A3A79667028181009BFF4F66231B1F7A669A0C7265139401A3B9C908F0B8EEDBB968986C735ACA10416D7833725B060DC6886948DA4A201F3D89EEE7F1A5290BF74ADD7F787C06797B82C5FD234038E7D9DF89F2B440D7A95557A89E87667EE65FCB8764CC403380CECC4CA6CD7145AA4368B61700EECFA9E1DBC5660793125FE8C9412E01B62B33028180632AADD91ADDA462D995A672625B05CDA94621F4E95973EE8F9A2DEB71A1C1AC1BD31A0DD6A28975871B6A7BEB6E5561B4A12C60A3A469EF7A77582B35C7F855B9B76CCACFC0774845FEA9452FB1E3A98C05FB9AA7526819C5C4498E0DC1DB1BA58A3BD4FB8183291E34768EDA7AB4058726FD1C8D147B8965DF8F15F39EBC37

 

 

 

testkey.x509.pem內容是:

-----BEGIN CERTIFICATE-----MIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waMqOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzURNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97szI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkwHQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZAFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZaJ6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4YLCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe+ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwrsBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE0=-----END CERTIFICATE-----

 

pem檔案是openSSL產生的.但是跟keystore如何轉換,不知道啊...

 

 

 

 

轉載請註明出處:http://www.cnblogs.com/ayanmw 我會很高興的!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.