apk的簽名,簡單說開發者可以通過簽名 對應用進行標識和更新。包名在一個設備上是唯一的,這樣可以避免被相同包名應用隨意覆蓋安裝。這是一個非常重要的安全功能。
系統中的簽名文件,也是對系統中應用進行簽名,編譯應用是可以指定簽名類型。
下面介紹的是Android系統中的簽名相關內容。
Android系統中的主要簽名文件
media.pk8,media.x509.pem;platform.pk8,platform.x509.pem;releasekey.pk8,releasekey.x509.pem;shared.pk8,shared.x509.pem;testkey.pk8,testkey.x509.pem。
Android系統中的簽名文件的路徑
build/target/product/security/目錄下。
編譯時簽名文件的配置
在Android.mk通過設置LOCAL_CERTIFICATE實現。如:LOCAL_CERTIFICATE := platform即選擇platform來簽名。
注:預置無源碼的apk應用時,很多時候仍然使用原本第三方簽名,LOCAL_CERTIFICATE := PRESIGNED。
.pk8和.x509.pem的區別
.pk8就是私鑰文件,用於對apk進行簽名。這個私鑰需要保密保存,不能公開。
.x509.pem是證書文件,相當於公鑰。這個可以公開,主要用於驗證某個apk是否由相應的私鑰簽名。
系統不同簽名文件的區別
簡介:
-
sharedUserId
每個apk或文件,系統都會分配屬於自己的統一的用戶ID(UID),創建沙箱保證其他應用的影響或影響其他應用。如:一般應用只能訪問自己包名下的文件(/data/data/pkgname),不能反問其他包名下的,其他應用也訪問不了自己包名下的文件。
sharedUserId,擁有同一user id的應用 之間就可以共享數據庫和文件,相互訪問。這些應用可以運行在同一進程,也可以運行不同進程。
-
sharedUserId與簽名文件
只有擁有相同sharedUserId標簽的,且擁有相同簽名的 應用才能分配相同的用戶ID,實現數據共享。如果僅僅擁有相同sharedUserId標簽,是無法確保安全的,也很容易被非法利用。
系統中5類簽名文件說明
- platform:平台的核心應用簽名,簽名的apk是完成系統的核心功能。這些apk所在的進程UID是system。manifest節點中有添加android:sharedUserId="android.uid.system"。
- media: 這個簽名的apk是media/download的一部分。manifest節點中有添加android:sharedUserId="android.media"。
- shared:這個簽名的apk可以和home/contacts進程共享數據。manifest節點中有添加android:sharedUserId="android.uid.shared"。
- testkey/releasekey:平台默認key。在編譯中未指定LOCAL_CERTIFICATE的,默認是用testkey。因為testkey是公開的,任何人都可以獲取,不安全,所以一般使用 自己創建releasekey作為默認key。
修改平台默認簽名
- build/core/config.mk路徑下,修改下面變量為:
DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey
或者使用宏控選擇。
- system/sepolicy/private/keys.conf 和 system/sepolicy/prebuilts/api/{apilevel}/private/keys.conf下,修改:
-ENG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem -USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem -USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem +ENG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem +USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem +USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
- build/core/core/Makefile下修改變量為:
BUILD_VERSION_TAGS = release-keys
或者使用宏控選擇。
平台簽名的創建
在工程目錄下執行下面命令就可以生成一套platform,shared,media,releasekey簽名文件:
subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' mkdir ~/.android-certs for x in releasekey platform shared media; do \ ./development/tools/make_key ~/.android-certs/$x "$subject"; \ done
注:
- 生成是用工程中的./development/tools/make_key腳本,依次生成
- subject中參數的含義:
C ---> Country Name (2 letter code)
ST ---> State or Province Name (full name)
L ---> Locality Name (eg, city)
O ---> Organization Name (eg, company)
OU ---> Organizational Unit Name (eg, section)
CN ---> Common Name (eg, your name or your server's hostname)
emailAddress ---> Contact email address
- 生成簽名文件過程,一般按回車,若輸入密碼后面簽名apk需要手動輸入。
查看簽名apk的簽名信息
keytool -printcert -jarfile xxx.apk
使用這個命令能夠查看apk所使用簽名的相關信息,如下圖所示
使用系統簽名文件直接給apk簽名
java -Djava.library.path=. -jar signapk.jar xxx.x509.pem xxx.pk8 beforesign.apk aftersign.apk
如下示例,
將app-debug.apk使用releasekey簽名,簽名后的apk名字為app-debug_release.apk。
注意路徑,如 signapk.jar路徑在out/host/linux-x86/framework/signapk.jar,可以拷貝出來。平台簽名文件路徑上面已經講過。如果出現報錯,多注意下提示,調整即可。
java -Djava.library.path=. -jar signapk.jar releasekey.x509.pem releasekey.pk8 app-debug.apk app-debug_release.apk