① 如何為apk以及zip文件簽名
如果你只是想知道如何簽名及下載簽名工具,請直接看「如何使用SignApk.jar來為一個apk或zip文件簽名」部分。要創建自己的證書請從頭看起。
准備知識:
當你要發布一個軟體或是自製的ROM時,你就需要一個使用了私鑰的證書來為.apk或.zip文件進行簽名。android系統使用證書來識別軟體作者和軟體之間所建立的認證關系。做這個事情最經典的方式就是用keytool創建證書,然後使用jarsigner進行簽名。但是本教程則會提供一個對於大多數人來說更為容易的方法,那就是使用一個名為SignApk.jar的工具。
SignApk.jar是一個已包含在Android平台源碼包中的工具,你可以在本貼的附件中下載。如果要使用SignApk.jar,你需要創建一個帶有對應證書/公鑰的私鑰。而你可以使用Openssl來創建私鑰/公鑰對。在Unix/Linux系統中使用Openssl相對來說比較容易。對於Windows用戶,你可以在本貼附件或此鏈接中下載Windows版本的Openssl。
如何使用OpenSSL創建私鑰/公鑰對(也就通常說的證書文件,有誤勿怪)(Windows版本)
下載附件中的openssl-0.9.8k_WIN32.zip
將下載到的壓縮包解壓到你電腦上的任意位置(例如:C:\OpenSSL)
在OpenSSL\bin文件夾下按順序輸入(使用CMD命令行工具,其中第2步會需要你輸入一些信息,見圖):
1、openssl genrsa -out key.pem 1024
2、openssl req -new -key key.pem -config C:\OpenSSL\openssl.cnf -out request.pem
3、openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
4、openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
大星星提示:如果你的recovery不具備簽名校驗切換功能,那麼用你自己生成的證書文件來給ROM簽名,會提示簽名校驗失敗。因為目前幾乎所有的第三方recovery中所帶的私鑰都是testkey的。(附件中的android.zip裡面所包含的證書文件已更新為testkey)
如何使用SignApk.jar來為一個apk或zip文件簽名:
下載附件中的android.zip
將下載到的壓縮包解壓到你電腦上的任意位置(例如:C:\android)
如果你的電腦上還沒有安裝java環境,請下載並進行安裝。
(如果你創建了自己的私鑰/公鑰對)復制certificate.pem和key.pk8到你解壓得到的android文件夾中
使用CMD命令行工具cd到android文件夾,然後輸入:(對於我提供的包,只需要將要簽名的文件放在android文件夾中,然後拖至對應的批處理文件上即可)
java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk
或是
java -jar signapk.jar certificate.pem key.pk8 your-update.zip your-signed-update.zip
② 用命令給apk簽名
給apk簽名。
用已有的jks文件帶賀給apk簽名。
先打開jdk文件夾,例如E:\Program Files\Java\jdk1.8.0_201\bin。
然後打開cmd輸入以下命令
其中alias就是當初創建簽名文件時所設定的,碰塵不能笑行禪隨便寫。
在簽名之前應當刪除apk中META-INF中的文件,以免簽名沖突。
2021年8月4日
③ 怎麼給Android應用程序簽名
不管是模擬器還是真實手機。因此,在設備或者是模擬器上運行調試程序之前,必須為應用程序設置數字簽名。 所有的程序都必須簽名,沒有被簽名的程序,系統將不能安裝。 可使用自簽署證書簽署應用程序,無須授權憑證。系統僅僅會在安裝的時候測試簽名證書的有效期,如果應用程序的簽名是在安裝之後才到期,那麼應用程序仍然可以正常啟用。可以使用標准工具-Keytool and Jarsigner-生成密鑰,來簽名應用程序的.apk文件。 Android SDK 工具可以在調試時給應用程序簽名。ADT插件和Ant編譯工具都提供了兩種簽名模式-debug模式和release模式 debug模式下,編譯工具使用JDK中的通用程序Keytool通過已知方法和密碼創建秘鎖和密鑰。每次編譯的時候,工具使用debug密鑰簽名應用程序的.apk文件。因為密碼是已知的,工具 不需要在每次編譯的時候提示輸入密鎖和密鑰。 當應用程序調試完畢准備要發布release版本時,可以在release模式下編譯。release模式下,編譯工具不會將.apk文件簽名。尺梁需要自己用Keytool生成密鑰和密鎖,再用JDK中的Jarsigner工具給.apk文件簽名。簽名基本設置 首先設置JAVA_HOME環境變數,告訴SDK如何找到Keytool,或者可以在Windows 系統環境變數PATH變數中添加Keytool的JDK路徑。 在發布release版本時,從Package面版上按選中你的project,按滑鼠右鍵,依次選擇Android Tools、Export Application Package。或者可以點擊Manifest Editor,overview 頁面上的「Exporting the unsigned .apk」連接 ,導出未簽名apk文件。保存.apk文件後,用Jarsigner及自己的旁握密鑰給apk文件簽名,如果沒有密陵啟運鑰, 可以用Keystore創建密鑰和密鎖。如果已經有一個密鑰了,如公共密鑰,就可以給.apk文件簽名了。 也可以把上面這個完整的步驟寫成一個bat文件,這樣需要簽名的時候只要運行這個bat就可以了。下面給出一個完整的bat文件示例: @Rem android簽名程序 //注釋指令 @Rem echo是顯示指令 格式:echo [{on|off}] [message] @echo ********************************************************** @Rem 文件是否存在命令格式:if exist 路徑+文件名 命令 @if exist d:sign/MyFirstApp.keystore goto sign @echo 創建簽名文件MyFirstApp.keystore @Rem keytool命令格式:-genkey產生簽名 -alias別名 -keyalg加密演算法 -validity有效天數 -keystore生產簽名文件名稱keytool -genkey -alias MyFirstApp.keystore -keyalg RSA -validity 40000 -keystore MyFirstApp.keystore @echo 開始簽名: @Rem jarsigner命令格式:-verbose輸出詳細信息 -keystore密鑰庫位置 -signedjar要生成的文件 要簽名的文件 密鑰庫文件 jarsigner -verbose -keystore MyFirstApp.keystore -signedjar MyFirstApp_signed.apk MyFirstApp.apk MyFirstApp.keystore @goto over :sign @echo 開始簽名:jarsigner -verbose -keystore MyFirstApp.keystore -signedjar MyFirstApp_signed.apk MyFirstApp.apk MyFirstApp.keystore :over @echo ********************MyFirstApp.apk 簽名完成*********************** pause 以上是一個給應用簽名的完整bat文件,在運行這個bat文件時,還需要按照屏幕提示的步驟輸入一些必要信息,最後生成一個簽名後的文件是:MyFirstApp_signed.apk。
④ APK簽名機制原理詳解
眾所周知,Android系統在安裝Apk的過程中,會對Apk進行簽名校驗,校驗通過後才能安裝成功。那你知道簽名校驗的機制是什麼?具體校驗的是什麼內容嗎?申請第三方SDK(如微信支付)時填入的SAH1值是什絕頌高么?目前眾多的快速批量打包方案又是如何繞過簽名檢驗的?
我將通過一系列的文章來解開這些疑惑:
這篇文章先來介紹Apk簽名相關的基本知識。
要知道簽名是什麼,先來看為什麼需要簽名 。大家都知道,在消息通信時,必須至少解決兩個問題:一是確保消息來源的真實性,二是確保消息不會被第三方篡改。在安裝Apk時,同樣需要確保Apk來源的真實性,以及Apk沒有被第三方篡改。如何解決這兩個問題呢?方法就是開發者對Apk進行簽名:在Apk中寫入一個「指紋」。指紋寫入以後,Apk中有任何修改,都會導致這個指紋無效,Android系統在安裝Apk進行簽名校驗時就會不通過,從而保證了安全性。
要了解如何實現簽名,需要了解兩個基本概念:數字摘要和數字證書。
簡單來說,就是對一個任意長度的數據,通過一個Hash演算法計算後,都可以得到一個固定長度的二進制數據,這個數據就稱為「摘要」。摘要具有下面的幾個特徵:
前面已經說到,可以通過簽名來確保數據來源的可靠性和數據的不可篡改性。簽名就是在摘要的基礎上再進行一次加密,對摘要加密後的數據就可以當作數字簽名,在安裝Apk需要對簽名進行驗證,驗證通過才能繼續安裝。
這里有兩個過程:簽名過程 和 校驗過程。
先來說 簽名過程:
再來看 校驗過程:
這里有一個前提:接收方必須要知道發送方的公鑰和所使用的演算法。如果數字簽名和公鑰一起被篡改,接收方無法得知,還是會校驗通過。如何保證公鑰的可靠性呢?答案是數字證書,數字證書是身份認證機構(Certificate Authority)頒發的,包含了以下信息:
接收方收到消息後,先向CA驗證證書的合法性(根據證書的簽名、綁定的域名等信息。CA機構是權威的,可以保證這個過程的可靠性。)再進行簽名校驗。
需要注意的是,Apk的證書通常的自簽名的,也就是由開發者自己製作,沒有向CA機構申請。Android在安裝Apk時並沒有校驗證書本身的合法性,只是從證書中提取公鑰和加密演算法,這也正是對第三方Apk重新簽名後,還能夠繼續在沒有安裝這個Apk的系統中繼續安裝的原因。
我們在對Apk簽名時並沒有直接指定私鑰、公鑰和數字證書,而是使用keystore文件,這些信息都包含在了keystore文件中。根據編碼不同,keystore文件分為很多種,Android使用的是Java標准keystore格式JKS(Java Key Storage),所以通過Android Studio導出的keystore文件是以.jks結尾的。
keystore使用的證書標準是X.509,X.509標准也有多種編碼格式,常用的有兩種:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。jks使用的是der格式,Android也支持直接使用pem格式的證書進行簽名,我們下面會介紹。
兩種證書編碼格式的區別:
X.509證書格式:
Android提供了兩種對Apk的簽名方式,一種是基於JAR的簽名方式,另一種是基於Apk的簽名方式,它們的主要區別在於使用的簽名文件不一樣:jarsigner使用keystore文件進行簽名;apksigner除了並尺支持使用keystore文件進行簽名外,還支持直接指定pem證書文件和私鑰進行簽名。
不知道大家有沒有注意一個問題,我們通過櫻御keytool或者AS生成一個keystore的時候( 簽署您的應用 ),除了要輸入keystore的密碼外,還要輸入一個alias和key的密碼。在簽名時,除了要指定keystore文件和密碼外,也要指定alias和key的密碼,這是為什麼呢?
原因是keystore是一個密鑰庫,也就是說它可以存儲多對密鑰和證書,keystore的密碼是用於保護keystore本身的,一對密鑰和證書是通過alias來區分的。從這里可以看出jarsigner是支持使用多個證書對Apk進行簽名的。apksigner也同樣支持,關於apksigner的使用介紹可以參考官方文檔 apksigner 。
ok,簽名的基本概念和校驗過程就介紹到這里,關於JAR簽名和V2簽名機制的詳細介紹,參考下面兩篇文章:
⑤ 如何對Android的APP進行簽名
簽名方法:
1.使用Keytool 和jarsigner工具簽名(在jdk/bin目錄下)
1.生成簽名keystore:
確保電腦上安裝了JDK,因為我們將使用JDK自帶的創建和管理數字證書的工具Keytool。在命令行下輸入如下命令:
keytool -genkey -v -keystore app.keystore -alias alias_name -keyalg RSA -validity 20000
-alias 後面跟的是別名這里是alias_name
-keyalg 是加密方式這里是RSA
-validity 是有效期這里是20000
-keystore 就是要生成的keystore的名稱這里是app.keystore
然後按回車鍵
按回車後首先會提示你輸入的密碼:這個在簽腔譽名時要用的,要記住
然後會再確認你的密碼。
之後會依次叫你輸入姓名、組織單位、組織名稱、城市區域、省份名稱、國家代碼(CN)等。
Keytool的詳細參數請參考:
http://www.android123.com.cn/androidkaifa/173.html
2.簽名:
jarsigner -verbose -keystore app.keystore -signedjar app_signed.apk app.apk alias_name
-keystore: keystore的名稱
-signedjar app_signed.apk: 指定簽名後生成的APK名稱
app.apk: 目標APK
然後按回車:會要氏帆求輸入剛才設置的密碼,輸入後按回車就開始簽名了。
3.查看簽名:
jarsigner -verify app_signed.apk
查看是否簽名,如果已經簽名會列印 "jar verified".
jarsigner -verify -verbose -certs app_signed.apk
查看簽名詳細信息。
4.通過zipalign工具進行優化apk(android自帶的工具,./build/tools/zipalign)
zipalign -v 4 app_signed.apk androidres.apk 對apk優化
zipalign -c -v 4 androidres.apk 查看apk是否經過優化
2.使用eclipse ADT工具簽名
在Package Explorer 窗口,右鍵,選擇Android Tools--->Export Signed Application Package 然後按照提示一步一步,生成已簽名的apk。通過eclipse也可以導出未簽名的APK文件。
註:需要輸入兩次密碼,第一次是私鑰密碼,第二次時私鑰別名的伍核段密碼。
3.eclipse在debug模式下自動簽名(無須手動配置):
在debug模式下用eclipse 的ADT為android簽名,只要應用程序在eclipse下開發,系統就會自動給apk簽名和優化。
在Eclipse中Windows > Preferences > Android > Build可以看到你keysotre的位置
⑥ 如何對apk進行簽名
給apk文件簽名主要分三步:
1、創建證書
2、簽名
3、優叢橡化(可選)
1)使用jdk的keytool工具生成簽名用的證書> keytool -genkey -v -alias CERT -keyalg RSA -keysize 2048 -validity 10000 -keystoreCERT.keystore 創建過程需要輸入一些標識信息和密碼,一些重要的參數值說明如下(根據自己的需要要進行相應的修改): CERT.keystore ---- 證書保存的文件名 CERT ---- 證書的別名 10000 ---- 10000天的有效期 2048 ---- 默認為1024 bits,Android 建議使用2048 bits或更高其他的詳細信息可以使用keytool -help查看幫助 證書生成後使用仿梁如下命令可以查看證書的信息:> keytool -list -alias CERT -keystore CERT.keystore
2)使用jdk的jarsigner工具對apk文件簽名> jarsigner -verbose -keystore CERT.keystore to_sign.apk CERT 簽名過程需要輸入證書的密碼,一些重要的參數值說明如下(根據自己的需要要進行相應的修改): CERT.keystore ---- 證書保存的文件名 CERT ---- 證書的別名 待簽名的apk文件根根目錄下如果有文件夾「META-INFO」,請先刪除(重新簽名就需要這樣做)備鄭運。如果不想創建過程輸出太多信息,可以刪除「-verbose」 。上述簽名會直接覆蓋原來的文件,如果不想被覆蓋而簽名為另外的新文件 signed.akp,只需將 to_sign.apk 改為 -signedjar to_sign.apk signed.akp 即可。簽名後可以使用如下命令驗證是否簽名成功: > jarsigner -verify to_sign.apk 如果需要查看更詳細的驗證信息,可修改為:> jarsigner -certs -verbose -verify to_sign.apk
3)使用android sdk的zipalign工具優化已簽名的apk文件> zipalign -v 4 unaligned.apk aligned.apk 注意要在簽名後再zipalign。這個工具不是jdk自帶的,而是在%ANDROID_HOME%\tools\zipalign.exe。
⑦ 如何讓應用程序獲得系統許可權以及如何使用platform密鑰給apk簽名
Android中許多函數只能是系統程序或者有root許可權的程序才可以調用,否則會有"Permission denied"異常。所以如果開發時要調用此類函數,必須授予程序root許可權。下面是兩種具體的實現方法
註:兩種方法都不一定適用於所有android系統。
方法一:需要在清掘Android系統源碼的環境下用make來編譯:
在應用程序的 AndroidManifest.xml 中的 manifest 節點中加入 android:sharedUserId="android.uid.system" 這個屬性
修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。
方法二:
同上,加入android:sharedUserId="android.uid.system"這個屬性。
使用eclipse編譯出apk文件,但是這個apk文件是不能用的。
用壓縮軟並漏件打開apk文件,刪掉META-INF目錄下的CERT.SF和CERT.RSA兩個文件。 (這一步我跳過了(原本是無意的,後來發現下面也有提到),結果一樣可以)
使
用目標系統的platform密鑰來重新給apk文件簽名。這步比較麻煩,首先找到密鑰文件,在Android源碼目錄中的位置
是"build\target\proct\security",下面的platform.pk8和platform.x509.pem兩個文件。然
後用Android提供的Signapk工具來簽名,signapk的源代碼是在"build\tools\signapk"下,用法為"signapk
platform.x509.pem platform.pk8 input.apk
output.apk",文件名最好使用絕對路徑防止找不到,也可以修改源代碼直接使用。
<此時這樣最後得到的apk和第一個方法是一樣的>
解釋一下原理,首先加入
android:sharedUserId="android.uid.system"這個屬性。通過Shared User id,擁有同一個User
id的多個APK可以配置成運行在同一個進程中。那麼把程序的UID配成android.uid.system,也就是要讓程序運行在系統進程中,這樣就
有許可權來調用那些需要系統許可權的函數了。 只是加入UID還不夠,如果這時候答蔽核安裝APK的話發現無法安裝,提示簽名不符,原因是程序想要運行在系統進程中
還要有目標系統的platform
key,就是上面第二個方法提到的platform.pk8和platform.x509.pem兩個文件。用這兩個key簽名後apk才真正可以放入系
統進程中。第一個方法中加入LOCAL_CERTIFICATE := platform其實就是用這兩個key來簽名。
有一個問題,就是這樣生成的程序只有在原始的Android系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到
platform.pk8
和platform.x509.pem兩個文件。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android中的key
來簽名,程序在模擬器上運行OK,不過放到G3上安裝直接提示"Package ... has no signatures that match
those in shared user android.uid.system",這樣也是保護了系統的安全。
最後說一下,這個android:sharedUserId屬性不只可以把apk放到系統進程中,也可以配置多個APK運行在一個進程中,這樣可以共享數據,應該會很有用的。
⑧ 對未簽名的 APK 重簽名
在對某個 APP 進行逆向時,最後一步將修改應用到 APK 中往往會生成未簽名的 APK,而 Android 要求每個 APK 都必須要有簽名才能被安裝,因此我們需要對未簽名的 APK 進行簽名
在 keytool 所在的文件夾下(通常是 C:\Program Files\Java\jdk1.8.0_101\bin 之類的)以管理員身份執行如下命令
-keystore reverse_engineer.keystore 表示生成的數字證書的文件名為 "reverse_engineer.keystore";
-alias rekeystore 表示證書的別名為 "rekeystore",可以與 keystore 一樣;
-keyalg RSA 表示生成密鑰文件所採用的演算法為 RSA;
-validity 10000 表示該數字證書的有效期為10000天,意味著10000天之後該證書將失效;
然後根據提示輸入密鑰、地區等信息。最終,這條命令將生成名為 reverse_engineer.keystore 的數字證書
將數字證書拷貝到需要簽名的 apk 的目錄下,在 jarsigner 所在的文件夾下(通常是 C:\Program Files\Java\jdk1.8.0_101\bin 之類的)以管理員身份執行如下命令執行如下命令
-keystore 表示使用當前目錄中的 reverse_engineer.keystore 簽名證書文件;
-storepass 密鑰口令;
-signedjar crackme02_release.apk表示簽名後生成的APK名稱;
crackme02.apk 表示未簽名的APK;
rekeystore 表示 reverse_engineer.keystore 的別名
如果你不是被逆向的 APP 的作者,那麼你重簽名時使用的私鑰在絕大多數情況下不會和逆向前的 APP 相同。在 Android 的安全策略下,這樣的 APP 是不能被安裝的,因此需要將之前的 APP 卸載掉,才能將重新打包後的 APK 重新安裝到 Android 設備上
參考文章:
Android反編譯(三)之重簽名
⑨ 如何對Android的APP進行簽名
1.簽名的步驟
a.創建key
b.使用步驟a中產生的key對apk簽名
2.具體操作
方法一: 命令行下對apk簽名(原理)
創建key,需要用到keytool.exe (位於jdk1.6.0_24jrein目錄下),使用產生的key對apk簽名用到的是jarsigner.exe (位於jdk1.6.0_24in目錄下),把上兩個軟體所在的目錄添加到環境變數path後,打開cmd輸入
D:>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
/*說明:-genkey 產生密鑰
-alias demo.keystore 別名 demo.keystore
-keyalg RSA 使用RSA演算法對簽名加密
-validity 40000 有效期限4000天
-keystore demo.keystore */
D:>jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore
/*說明:-verbose 輸出簽名的詳細信息
-keystore demo.keystore 密鑰庫位置
-signedjar demor_signed.apk demo.apk demo.keystore 正式簽名,三個參數中依次為簽名後產生的文件demo_signed,要簽名的文件demo.apk和密鑰庫demo.keystore.*/
注意事項:android工程的bin目錄下的demo.apk默認是已經使用debug用戶簽名的,所以不能使用上述步驟對此文件再次簽名。正確步驟應該是:在工程點擊右鍵->Anroid Tools-Export Unsigned Application Package導出的apk採用上述步驟簽名。
方法二:使用Eclipse導出帶簽名的apk
Eclipse直接能導出帶簽名的最終apk,非常方便,推薦使用,步驟如下:
第一步:導出。
第二步:創建密鑰庫keystore,輸入密鑰庫導出位置和密碼,記住密碼,下次Use existing keystore會用到。
第三步:填寫密鑰庫信息,填寫一些apk文件的密碼,使用期限和組織單位的信息。
第四步:生成帶簽名的apk文件,到此就結束了。
第五步:如果下次發布版本的時候,使用前面生成的keystore再簽名。
第六步:Next,Next,結束!
方法三:使用IntelliJ IDEA導出帶簽名的apk
方法步驟基本和Eclipse相同,大概操作路徑是:菜單Tools->Andrdoid->Export signed apk。
⑩ 手機怎麼給APK簽名
經常在手機端修改Android軟體的同學肯定知道,在APK被修改之後就需要重新來簽名,否則是念桐無法正常安裝的。既然是手機黨,自然接觸電腦的機會就少了很多,小編也不去教大家如何在電腦上給APK簽名了,咱們就說說如何用天天握在手上的手機怎麼簽名APK文件吧。
這里需要用到手機端簽名的工具ZipSigner,這個工具不僅可給APK簽名,還支持zip及jar格式。自己修改過ROM包後也可用它來進行簽名。大夥先納高歷在手機上安裝好。
去除APK原簽名文件
我們把修改完成的APK在電腦上用解壓縮軟體打開,打開到META-INF文件夾,把裡面的幾個簽名文件都刪除,這個步驟是為洞搜了提高簽名的成功率,通常不做也可以。
APK簽名
ZipSigner安裝後打開界面如圖,默認的簽名文件為SD卡上的unsigned.zip,可以把需要簽名的APK改成這個名字,放到SD卡根目錄,進行簽名,簽名後把signed.zip後綴名改成APK就可以了。也可以不用改名,把需要簽名的APK文件放到SD卡根目錄,然後點「選擇輸入/輸出文件」,找到要簽名的APK,程序里的ZipSigner輸入/輸出文件名也自動會相應更改了。文件選擇好後點「簽名選擇文件」很快簽名就完成了。
簽名後安裝
我們驗證下簽名後的APK程序是否能正常安裝,用文件管理器在SD卡找到剛簽名生成的APK,進行安裝,果然可以正常安裝了,好了,可以收工了。
簽名其實就是一個很簡單的過程,只不過我們可以用程序把他簡單化。當然大家記住一個原則,無論是修改了APK的什麼元素,只要是APK的結構產生了變化,就一定需要重新簽名才能正常使用。