在進行移動MM集成的時候總是會遇到一個bug: failed to find resource file(mmiap.xml}
jarsigner -verbose -keystore C:\Users\yi.guo\Desktop\unitygames.keystore -signedjar fightback_sign.apk -digestalg SHA1 -sigalg MD5withRSA newfightback.apk unitygameskey
zipalign -v 4 C:\Users\yi.guo\Desktop\test01\testfightback.apk C:\Users\yi.guo\Desktop\test01\fightback_signed.apk
jarsigner用法: [選項] jar 文件別名
jarsigner -verify [選項] jar 文件
[-keystore <url>] 密鑰庫位置
[-storepass <口令>] 用於密鑰庫完整性的口令
[-storetype <類型>] 密鑰庫類型
[-keypass <口令>] 專用密鑰的口令(如果不同)
[-sigfile <文件>] .SF/.DSA 文件的名稱
[-signedjar <文件>] 已簽名的 JAR 文件的名稱
[-digestalg <算法>] 摘要算法的名稱
[-sigalg <算法>] 簽名算法的名稱
[-verify] 驗證已簽名的 JAR 文件
[-verbose] 簽名/驗證時輸出詳細信息
[-certs] 輸出詳細信息和驗證時顯示證書
[-tsa <url>] 時間戳機構的位置
[-tsacert <別名>] 時間戳機構的公共密鑰證書
[-altsigner <類>] 替代的簽名機制的類名
[-altsignerpath <路徑列表>] 替代的簽名機制的位置
[-internalsf] 在簽名塊內包含 .SF 文件
[-sectionsonly] 不計算整個清單的散列
[-protected] 密鑰庫已保護驗證路徑
[-providerName <名稱>] 提供者名稱
[-providerClass <類> 加密服務提供者的名稱
[-providerArg <參數>]] ... 主類文件和構造函數參數
下面列出並說明了各種 jarsigner 選項。注意:
- 所有選項名前都有一個減號 (-)。
- 選項可以以任何次序提供。
- 斜體項(選項值)代表必須提供的實際值。
-keystore
、-storepass
、-keypass
、-sigfile
和-signedjar
選項僅在爲 JAR 文件簽名時相關,而不是在校驗已簽名的 JAR 文件時。同樣,別名僅在爲 JAR 文件簽名時在命令行中指定。
-keystore
url- 指定密鑰倉庫的 URL。缺省值是用戶的宿主目錄中的 .keystore 文件,它由系統屬性“user.home”決定。
簽名時需要密鑰倉庫,因此如果沒有缺省的(或要使用非缺省的)密鑰倉庫,就必須明確指定一個。
校驗時不需要密鑰倉庫,但如果指定了一個,或存在缺省的,且
-verbose
選項也被指定了,則將輸出該密鑰倉庫中是否包含了用於校驗 JAR 文件的證書的附加信息。注意:
-keystore
參數實際上可以是指定的文件名(及路徑)而不是 URL,這種情況下它將當作“file:” URL. 也就是說,-keystore filePathAndName被當作等價於
-keystore file:filePathAndName-storetype
storetype- 指定要被實例化的密鑰倉庫類型。默認的密鑰倉庫類型是安全屬性文件中 "keystore.type" 屬性值所指定的那個類型,由
java.security.KeyStore
中的靜態方法getDefaultType
返回。-storepass
password- 指定訪問密鑰倉庫所需的口令。這僅在簽名(不是校驗)JAR 文件時需要。在這種情況下,如果命令行中沒有提供
-storepass
選項,用戶將被提示輸入口令。注意: 口令不應在命令行或腳本中指定,除非是爲了測試,或在安全系統中。並且,在口令提示下鍵入口令時將顯示出鍵入的字符,因此不要在其它人面前鍵入。
-keypass
password- 指定用於保護密鑰倉庫項(由命令行中指定的別名標出)的私鑰的口令。使用 jarsigner 爲 JAR 文件簽名時需要該口令。如果命令行中沒有提供口令,且所需的口令與密鑰倉庫的口令不同,則將提示用戶輸入它。
注意: 口令不應在命令行或腳本中指定,除非是爲了測試,或在安全系統中。並且,在口令提示下鍵入口令時將顯示出鍵入的字符,因此不要在其它人面前鍵入。
-sigfile
file- 指定用於生成 .SF 和 .DSA 文件的基本文件名。例如,如果 file 爲“DUKESIGN”,則生成的 .SF 和 .DSA 文件將被命名爲“DUKESIGN.SF”和“DUKESIGN.DSA”,並將放到已簽名的 JAR 文件的“META-INF”目錄中。
file 中的字符應來自“a-zA-Z0-9_-”。也就是說,只允許字母、數字、下劃線和連字符。注意: .SF 和 .DSA 文件名中小寫字母將被轉換爲大寫字母。
如果命令行中沒有
-sigfile
選項,則 .SF 和 .DSA 文件的基本文件名將是命令行中指定的別名的前 8 個字符,並全部被轉換爲大寫。如果別名少於 8 個字符,將使用整個別名。如果別名中包含簽名文件名所不允許的字符,則形成文件名時這樣的字符將被轉換爲下劃線 ("_")。-signedjar
file- 指定用於已簽名的 JAR 文件的名稱。
如果命令行中沒有指定名稱,將使用輸入的 JAR 文件名(要簽名的 JAR 文件名);換句話說,該文件將被簽名 JAR 文件覆蓋。
-verify
- 如果它出現在命令行中,則指定的 JAR 文件將被校驗,而不是簽名。如果校驗成功,將顯示“jar verified”。如果試圖校驗未簽名的 JAR 文件,或校驗被不支持的算法(例如未安裝 RSA 提供者時使用的 RSA)簽名的 JAR 文件,則將有如下顯示: "jar is unsigned. (signatures missing or not parsable)"
可以校驗使用 jarsigner 或 JDK 1.1 javakey 工具或共用二者簽名的 JAR 文件。
有關校驗的詳細信息,參見 JAR 文件校驗。
-certs
- 如果它與
-verify
和-verbose
選項一起出現在命令行中,則輸出將包括 JAR 文件的每個簽名人的證書信息。該信息包括
- 驗證簽名人公鑰的證書的類型名(保存在 .DSA 文件中)
- 如果該證書是 X.509 證書(更準確地說是
java.security.cert.X509Certificate
的實例): 簽名人的特徵名密鑰倉庫也被檢查。如果命令行中沒有指定密鑰倉庫值,缺省密鑰倉庫文件(如果有)將被檢查。如果簽名人的公鑰證書與密鑰倉庫中的項匹配,則還將顯示下列信息:
- 該簽名人的密鑰倉庫項的別名,在圓括號中。如果該簽名人實際上來自於 JDK 1.1 身份數據庫而不是密鑰倉庫,則別名將顯示在方括號而不是圓括號中。
-verbose
- 如果它出現在命令行中,則代表“verbose”模式,它使 jarsigner 在 JAR 簽名或校驗過程中輸出額外信息。
-internalsf
- 過去,JAR 文件被簽名時產生的 .DSA(簽名塊)文件包含一個同時產生的 .SF 文件(簽名文件)的完整編碼副本。這種做法已被更改。爲了減小輸出 JAR 文件的整個大小,缺省情況下 .DSA 文件不再包含 .SF 文件的副本。但是如果
-internalsf
出現在命令行中,將採用舊的做法。該選項主要在測試時有用;實際上不應使用它,因爲這樣將消除有用的優化。-sectionsonly
- 如果它出現在命令行中,則 JAR 文件被簽名時生成的 .SF 文件(簽名文件)將不包括含有整個清單文件的散列的頭。它僅包含 與 JAR 中每個單獨的源文件相關的信息和散列,如簽名 (.SF) 文件所述。
缺省情況下,該頭將作爲一種優化手段添加。只要該頭存在,則無論何時 JAR 被校驗,都將首先檢查該頭中的散列是否真正與整個清單文件的散列匹配。如果匹配,校驗將進行下一步。如果不匹配,則有必要執行一個次優的校驗,檢查 .SF 文件中每個源文件信息部分中的散列是否等於清單文件中相應部分的散列。
有關的詳細信息,參見 JAR 文件校驗。
該選項主要在測試時有用;實際上不應使用它,因爲這樣將消除有用的優化。
-J
javaoption- 將指定的 javaoption 串直接傳遞到 Java 解釋器。((jarsigner 實際上是解釋器的一個 “wrapper”)。該選項不應含有任何空格。它有助於調整執行環境或內存使用。要獲得可用的解釋器選項的清單,可在命令行鍵入
java -h
或java -X
。
程序例子
簽名 JAR 文件
假設您有一個 JAR 文件名爲“bundle.jar”並且希望使用“working”目錄中名爲“mystore”的密鑰倉庫裏別名爲“Jane”的用戶的私鑰進行簽名。假設密鑰倉庫口令是“myspass”且 jane 的私鑰口令是“j638klm”。您可以使用下列命令爲該 JAR 文件簽名並將簽了名的 JAR 文件命名爲“sbundle.jar”:
jarsigner -keystore /working/mystore -storepass myspass -keypass j638klm -signedjar sbundle.jar bundle.jar jane注意上面的命令中沒有指定
-sigfile
,因此所產生的要放入已簽名 JAR 文件的 .SF 和 .DSA 文件將採用基於別名的缺省名。也就是說,它們將被命名爲JANE.SF
和JANE.DSA
。如果要根據提示輸入倉庫口令和私鑰口令,可以將上面的命令縮短爲
jarsigner -keystore /working/mystore -signedjar sbundle.jar bundle.jar jane如果要使用的是缺省密鑰倉庫(它在宿主目錄中,名爲“.keystore”),則不必指定密鑰倉庫,如下:
jarsigner -signedjar sbundle.jar bundle.jar jane最後,如果要使已簽名的 JAR 文件簡單地覆蓋輸入的 JAR 文件 (
bundle.jar
),則不必指定-signedjar
選項:jarsigner bundle.jar jane校驗已簽名的 JAR 文件
要校驗已簽名的 JAR 文件,(也就是說驗證簽名合法且 JAR 文件未被更改過)請使用如下命令:
jarsigner -verify sbundle.jar如果校驗成功,將顯示
jar verified.。否則將出現錯誤信息。
如果使用
-verbose
選項則將獲得更多的信息。下面是用-verbose
選項使用 jarsigner 的例子及其輸出:jarsigner -verify -verbose sbundle.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx.class smk 849 Fri Sep 26 16:12:46 PDT 1997 test.class s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore jar verified.校驗證書信息
如果校驗時與
-verify
和-verbose
選項一起指定了-certs
選項,則輸出將包括該 JAR 文件的每個簽名人的證書信息,其中包括證書類型、簽名人的特徵名信息(如果是 X.509 證書),以及括在圓括號中的簽名人的密鑰倉庫別名(如果 JAR 文件中的公鑰證書與密鑰倉庫項中的證書匹配。例如:jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA 208 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.SF 1087 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.DSA smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst.class X.509, CN=Test Group, OU=Java Software, O=Sun Microsystems, L=CUP, S=CA, C=US (javatest) X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane) s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore jar verified.如果簽名人的證書不是 X.509 證書,將沒有特徵名信息。這種情況下,僅顯示證書類型和別名。例如,如果該證書爲 PGP 證書,且別名爲“bob”,則將顯示
PGP, (bob)校驗包含身份數據庫簽名人的 JAR 文件
如果 JAR 文件已用 JDK 1.1 javakey 工具簽名,因此簽名人是身份數據庫中的別名,則校驗輸出將包括一個“i”符號。如果 JAR 文件同時被身份數據庫中的別名和密鑰倉庫中的別名二者簽名,則將出現“k”和“i”。
當使用了
-certs
選項時,任何身份數據庫別名都將顯示在方括號中,而不是顯示在用於密鑰倉庫別名的圓括號中。例如:jarsigner -keystore /working/mystore -verify -verbose -certs writeFile.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA 199 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.SF 1013 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.DSA smki 2752 Fri Sep 26 16:12:30 PDT 1997 writeFile.html X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane) X.509, CN=Duke, OU=Java Software, O=Sun, L=cup, S=ca, C=us [duke] s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified.注意別名“duke”在方括號中,這說明它是身份數據庫別名,不是密鑰倉庫別名。
因爲一些原因,要給未簽名的apk重新簽名,需要用到jarsigner工具,但是簽名之後,apk無法安裝,百思不得其解。終於找到一個解決方案,現在分享給大家:
在簽名時,要加上2個參數:
-digestalg SHA1 -sigalg MD5withRSA
造成無法簽名錯誤的原因,初步估計是JDK版本的問題。JDK 1.6簽名沒事,但是1.7會出這個問題。
完整的簽名命令如下:
jarsigner -verbose -keystore feelyou.keystore -storepass feelyou.info -signedjar signed.apk -digestalg SHA1 -sigalg MD5withRSA unsigned.apk feelyou
解釋:
1、-keystore feelyou.keystore:指定需要使用的簽名文件,直接寫文件名說明在當前目錄下,否則請自行指定具體路徑
2、-storepass feelyou.info:自動輸入密碼,keystore的密碼和alias的密碼都是我用的都是feelyou.info
3、-signedjar signed.apk:指定簽名後的文件存儲路徑,這裏是說以signed.apk的文件名存在當前路徑下
4、-digestalg SHA1 -sigalg MD5withRSA:這就是必須加上的參數,如果你是jdk 1.6也不受影響
5、unsigned.apk:未簽名的apk路徑,這裏是當前路徑下的unsigned.apk文件
6、feelyou:最後這個是alias,alias在unity的PlayerSetting/PulishingSettings/Alias的內容
例如:
另外一個例子:
用私鑰進行簽名
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