『壹』 PHP獲取安卓apk包里的apk簽名
所需工具:aapt,android SDK中的工具,只有一個exe,可以直接運行。
keytool,JDK中的工具,需要安裝JDK環境。
需要提供目標應用的apk
1、獲取包名
例如:aapt.exe mp badging C:\Users\Administrator\Desktop\demo-apk-1.0.1.8791.apk > C:\Users\Administrator\Desktop\1.txt
獲取到的包名是com.pakgname.swbg
2、獲取簽名
SHA1: 56:BD:02:6B:9D:53:D7:F5:32:B2:BC:BD:BB:34:5B:F1:CD:EF:7F:C0
這里藉助github開源的類apkparser
在項目composer.json中執行下面命令或修改composer.json引入即可
方法二適用於沒有java環境的情況下,一般linux都會有openssl環境。
原理:通過分析方法一中,發現apk包解壓之後,裡面會有.rsa簽名證書,此證書是一個符合pki體系的x509證書,通過openssl命令即可查看信息。
『貳』 Android Studio 之簽名
通過簽名可以確保數據來源的可靠性和數據的不可篡改性
對 Apk 進行簽名,也就是在 Apk 中寫入一個指紋,寫入指紋後,Apk 中有任何修改,都會導致這個指紋無效,Android 系統在安裝 Apk 進行簽名校驗時就會不通過,進而無法安裝該 Apk
如上圖:
通常的簽名驗簽過程中,接收方收到消息後,會先向 CA 機構驗證證書的合法性,再進行簽名校驗。但 Apk 的證書通常由開發者自己製作,沒有向 CA 機構申請,Android 系統在安裝 Apk 時也並沒有校驗證書本身的合法性,只是從證書中提取公鑰和加密演算法,因此,如果對第三方 Apk 重新簽名,也能安裝到沒有安裝過這個 Apk 的系統中
keystore 文件包含私鑰、公鑰和數字證書,分為很多種,Android 使用的是 Java 標准 keystore 格式 JKS(Java Key Storage)
Android App Bundle:用於通過 Google Play 發布的應用,需要升級到AS 3.2 以上版本才支持App Bundle 格式;
APK:用於創建可部署到設備上的簽名 APK
點擊 Finish 就會生成簽名文件與簽名後的 Apk
當我們需要升級 Apk 版本的時候,需要再次對 Apk 文件進行簽名,可以通過配置 build.gradle 讓其自動生成簽名後的 Apk
如果你的項目是開源的,需要把你的簽名信息寫在 local.properties 中,然後在 .gitignore 配置文件中加入 local.properties ,這樣 local.properties 就不會提交到開源項目中,簽名信息也就不會被人獲取
local.properties:
app/build.gradle:
有時候我們的 apk 中某些功能需要系統簽名,例如靜默安裝。測試系統簽名的 apk,需要 root 許可權,而帶 Google APIs 的模擬器不能 root,因此要注意不能選擇帶 Google APIs 的模擬器
下面執行的操作都是在 Linux 中,如果 apk 是 window 中生成的,需要拷貝到 linux 操作,再將生成的系統簽名過得 apk 再拷貝到 window,比較麻煩,可以考慮後面的自動系統簽名,還是需要在 linux 操作一次,不過之後就可以只在 window 操作了
這兩個文件在目錄 aosp/build/target/proct/security 下,如下圖
在目錄 aosp/prebuilts/sdk/tools/lib 下,如下圖
將前面獲取的 platform.pk8 、 platform.x509.pem 和 signapk.jar 文件放到需要簽名的 apk 同一個目錄,執行以下命令
如果出現上面的錯誤:Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]
解決方法:
到目錄 aosp/prebuilts/sdk/tools/linux/lib64 下,復制 libconscrypt_openjdk_jni.so 文件到需要簽名 apk 的同一個目錄,並將命令改為
自動進行系統簽名的原理是:先生成一個 system.jks 文件,使用 keytool-importkeypair 對 system.jks 文件進行系統簽名,再 build.gradle 和 local.properties 進行配置,直接使用帶有系統簽名的 system.jks 對 apk 進行簽名,這樣編譯生成的apk文件就自帶系統簽名了
按照前面的方法,生成一個 system.jks 文件,此時是在 window 系統中操作的
進入 keytool-importkeypair 目錄,將 system.jks、platform.pk8、platform.x509.pem 文件拷貝進來,拷貝之後的目錄結構為
使用 linux 中修改過的帶有系統簽名的 system.jks 文件將 window 中最開始生成的 system.jks 覆蓋掉,再像前面的自動簽名部分一樣,修改 build.gradle 和 local.properties 的配置,之後生成的 apk 就是系統簽名過的了
測試方法是,在 AndroidManifest.xml 中添加 android:sharedUserId="android.uid.system" 後安裝到 非 Google APIs 的模擬器上 , Google APIs 的模擬器不能 root,無法安裝
會發現只有使用 system.jks 文件簽名後才能安裝,否則安裝失敗,會報以下的錯誤:
『叄』 如何利用jks文件給apk簽名
jarsigner -verbose -keystore xxx.jks -signedjar xxx.apk(簽名後的apk名字) xxx.apk(需要簽名的apk) xxx(keystore別名)
以linux下為例:
進入android sdk下的platform-tools:輸入如下指令
jarsigner -verbose -keystore /cloud/xxx.jks -signedjar /cloud/app.apk( /cloud/app-unsigned.apk xxx
然後輸入密碼,即可簽名成功。
『肆』 如何為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