阿里巴巴吧做網(wǎng)站關(guān)鍵詞排名優(yōu)化網(wǎng)站
簡介
現(xiàn)在apk都需要簽名,Flutter做的項目官方規(guī)定編譯apk必須簽名。
簽名的好處:
- 應(yīng)用來源驗證: 應(yīng)用簽名允許Android系統(tǒng)驗證應(yīng)用的來源。每個應(yīng)用都使用開發(fā)者的私鑰進(jìn)行簽名,而應(yīng)用的簽名信息包含在應(yīng)用的APK文件中。當(dāng)用戶嘗試安裝應(yīng)用時,系統(tǒng)會檢查應(yīng)用的簽名,以確保它與系統(tǒng)中已知的相匹配。
- 應(yīng)用完整性驗證: 應(yīng)用簽名有助于確保應(yīng)用在傳輸過程中沒有被篡改。如果應(yīng)用在傳輸過程中被修改,其簽名將失效,系統(tǒng)會拒絕安裝或運(yùn)行該應(yīng)用。
- 權(quán)限聲明: 應(yīng)用簽名也與應(yīng)用的權(quán)限聲明相關(guān)。Android系統(tǒng)使用應(yīng)用簽名來確保應(yīng)用對敏感系統(tǒng)資源和API的訪問受到控制。如果應(yīng)用的簽名與其聲明的權(quán)限不匹配,系統(tǒng)會拒絕授予應(yīng)用相應(yīng)的權(quán)限。
- 防止重放攻擊: 應(yīng)用簽名可以防止重放攻擊,因為攻擊者無法將已簽名應(yīng)用的部分替換為其他內(nèi)容而不影響簽名的有效性
相關(guān)文檔
Android標(biāo)準(zhǔn)簽名key文件位于源碼的如下位置:/build/target/product/security/README
這個README 給出了相關(guān)說明:
For detailed information on key types and image signing, please see:https://source.android.com/devices/tech/ota/sign_builds.htmlThe test keys in this directory are used in development only and should
NEVER be used to sign packages in publicly released images (as that would
open a major security hole).key generation
--------------The following commands were used to generate the test key pairs:development/tools/make_key testkey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'signing using the openssl commandline (for boot/system images)
--------------------------------------------------------------1. convert pk8 format key to pem format% openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem2. create a signature using the pem format key% openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sigextracting public keys for embedding
------------------------------------dumpkey.jar is a Java tool that takes an x.509 certificate in PEM format as
input and prints a C structure to standard output:$ java -jar out/host/linux-x86/framework/dumpkey.jar build/target/product/security/testkey.x509.pem{64,0xc926ad21,{1795090719,2141396315,950055447,2581568430,4268923165,1920809988,546586521,3498997798,1776797858,3740060814,1805317999,1429410244,129622599,1422441418,1783893377,1222374759,2563319927,323993566,28517732,609753416,1826472888,215237850,4261642700,4049082591,3228462402,774857746,154822455,2497198897,2758199418,3019015328,2794777644,87251430,2534927978,120774784,571297800,3695899472,2479925187,3811625450,3401832990,2394869647,3267246207,950095497,555058928,414729973,1136544882,3044590084,465547824,4058146728,2731796054,1689838846,3890756939,1048029507,895090649,247140249,178744550,3547885223,3165179243,109881576,3944604415,1044303212,3772373029,2985150306,3737520932,3599964420},{3437017481,3784475129,2800224972,3086222688,251333580,2131931323,512774938,325948880,2657486437,2102694287,3820568226,792812816,1026422502,2053275343,2800889200,3113586810,165549746,4273519969,4065247892,1902789247,772932719,3941848426,3652744109,216871947,3164400649,1942378755,3996765851,1055777370,964047799,629391717,2232744317,3910558992,191868569,2758883837,3682816752,2997714732,2702529250,3570700455,3776873832,3924067546,3555689545,2758825434,1323144535,61311905,1997411085,376844204,213777604,4077323584,9135381,1625809335,2804742137,2952293945,1117190829,4237312782,1825108855,3013147971,1111251351,2568837572,1684324211,2520978805,367251975,810756730,2353784344,1175080310}}This is called by build/make/core/Makefile to incorporate the OTA signing keys
into the recovery image.
四種key
可以看到在Android系統(tǒng)中,有四種常見的簽名密鑰,分別是testkey、platform、shared和media。每個密鑰用于簽署不同類型的應(yīng)用或組件,具有不同的權(quán)限和用途。
- testkey:
類型: 開發(fā)和測試使用。
特點(diǎn): 通常用于開發(fā)和測試階段,不是用于生產(chǎn)環(huán)境。應(yīng)用使用 testkey 簽名時,系統(tǒng)會將其標(biāo)記為測試版本,通常會有一些限制,例如無法安裝在未解鎖的設(shè)備上。 - platform:
類型: Android平臺的系統(tǒng)應(yīng)用。
特點(diǎn): 用于簽署Android平臺的系統(tǒng)應(yīng)用,這些應(yīng)用是由設(shè)備制造商提供的預(yù)裝應(yīng)用。這種簽名允許應(yīng)用訪問系統(tǒng)的一些敏感權(quán)限和功能,而這些權(quán)限通常不允許其他應(yīng)用獲得。 - shared:
類型: 平臺的共享系統(tǒng)庫。
特點(diǎn): 主要用于簽署Android平臺上的共享系統(tǒng)庫,這些庫可以由多個應(yīng)用共享。共享庫可以提供一組通用的功能,供系統(tǒng)上的多個應(yīng)用使用。這使得庫可以更好地重用,減少重復(fù)的代碼。 - media:
類型: 用于簽署媒體庫。
特點(diǎn): 主要用于簽署Android平臺上的媒體庫,這些庫提供音頻和視頻處理功能。這樣的簽名允許庫訪問系統(tǒng)上的音頻和視頻資源,這對于多媒體應(yīng)用和功能非常重要。
應(yīng)用程序的Android.mk中有一個LOCAL_CERTIFICATE字段,由它指定哪個key簽名,未指定的默認(rèn)用testkey。
Android.bp中為:certificate: “platform”。build/target/product/security
目錄下查看:
.pk8代表私鑰,.x509.pem公鑰,它們都是成對出現(xiàn)。
生成key
從README可知,key是通過development/tools
目錄下的make_key腳本生成的,腳本需要傳入兩個參數(shù)。其中第一個參數(shù)是key的名字,我們可以不修改,使用aosp默認(rèn)的4個key的名字;第二個參數(shù)即是具體的一些屬性,此為key真正的關(guān)鍵(我們需要修改的部分),下面對第二個參數(shù)的一些具體屬性做出分析解釋:
C —> Country Name (2 letter code) #國家名稱(2 個字母代碼)
ST —> State or Province Name (full name) #州或省名稱(全名)
L —> Locality Name (eg, city) #地區(qū)名稱(例如,城市)
O —> Organization Name (eg, company) #組織名稱(例如,公司)
OU —> Organizational Unit Name (eg, section) #組織單位名稱(例如,部分)
CN —> Common Name (eg, your name or your server’s hostname) #通用名稱(例如,您的姓名或服務(wù)器的主機(jī)名)
emailAddress —> Contact email address #聯(lián)系電子郵件地址
因此,在生成key 的時候我們只需要AOSP的根目錄使用以下命令,注意替換面的內(nèi)容為自己的信息。
development/tools/make_key testkey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
值得注意的是用make_key生成key的過程中會提示輸入password,可以不輸入,直接enter。
生成之后我將這些key都放在了vendor/xxxx/android-certs/releasekey
路徑下
驗證key
在生成key后,再使用OpenSSL的工具來驗證一下生成的key是否正常進(jìn)入到/build/target/product/security
目錄,執(zhí)行如下命令:
openssl x509 -noout -subject -issuer -in platform.x509.pem
執(zhí)行后正確輸出你的參數(shù)信息即可
修改系統(tǒng)默認(rèn)簽名key
在上面提到如果apk中的編譯選項LOCAL_CERTIFICATE沒有設(shè)置的話,就會使用默認(rèn)的testkey作為簽名key,我們可以修改成自己想要的key,按照上面的步驟制作一個releasekey。
- 在build/make/core/Makefile中增加如下內(nèi)容
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -328,6 +328,12 @@ BUILD_KEYS := test-keyselseBUILD_KEYS := dev-keysendif
+
+# Here is a customization of which key signature to use
+ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),vendor/xxxx/android-certs/releasekey)
+BUILD_KEYS := release-keys
+endif
+BUILD_VERSION_TAGS += $(BUILD_KEYS)BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS)))
- 在具體產(chǎn)品的mk中增加如下內(nèi)容,vendor/xxxx/android-certs/releasekey為我存放各種key的路徑
--- a/device/amlogic/ohm/ohm.mk
+++ b/device/amlogic/ohm/ohm.mk
@@ -424,3 +424,7 @@ endifPRODUCT_PACKAGES += \Settings \SettingsIntelligence
+
+# android sign key
+PRODUCT_DEFAULT_DEV_CERTIFICATE := vendor/xxxx/android-certs/releasekey
+
- 修改/system/sepolicy/prebuilts/api/30.0/private/keys.conf下的內(nèi)容
--- a/system/sepolicy/prebuilts/api/30.0/private/keys.conf
+++ b/system/sepolicy/prebuilts/api/30.0/private/keys.conf
@@ -22,7 +22,7 @@ ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem# Example of ALL TARGET_BUILD_VARIANTS[@RELEASE]
-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
4. 修改/system/sepolicy/private/keys.conf下的內(nèi)容
--- a/system/sepolicy/private/keys.conf
+++ b/system/sepolicy/private/keys.conf
@@ -22,7 +22,7 @@ ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem# Example of ALL TARGET_BUILD_VARIANTS[@RELEASE]
-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
- 驗證打包編譯好的系統(tǒng)使用的簽名
編譯完成之后也可以在build.prop中查看到變量:
adb root
adb remount
adb shell
cd system
cat build.prop
會看到一行ro.build.tags=release-keys。
6. 生成 generate_verity_key
首先:
make generate_verity_key (mmm system/extras/verity/)
然后執(zhí)行:
out/host/linux-x86/bin/generate_verity_key -convert build/target/product/security/verity.x509.pem verity_key
重命名verity_key.pub為verity_key拷貝至build/target/product/security/
目錄,替換相應(yīng)的 key。
根據(jù)以上步驟把生成的相應(yīng)的key替換系統(tǒng)中build/target/product/security/
目錄下的key后重新編譯系統(tǒng),即可使用自己生成的系統(tǒng)簽名key。
系統(tǒng)key文件生成keystore
生成keystore文件主要是給外部apk開發(fā)簽名使用的;
以常用的platform簽名為例:
如果之前沒有生成platform.pem文件,現(xiàn)在可以執(zhí)行以下命令生成:
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocryp
生成platform.p12文件,設(shè)置對應(yīng)的密碼和alias名:([yourname]為自定義的aliasname,回車之后輸入密碼)
openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.pk12 -name [yourname]
生成platform.keystore:(需要JDK8以上版本,使用JDK8會報錯,[yourname]為自定義的aliasname,回車之后輸入密碼,[password]為上一步輸入的密碼)
keytool -importkeystore -destkeystore platform.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass [password] -alias [yourname]
最終的platform.keystore即為我們所要的keystore。
AndroidStudio導(dǎo)入生成的keystore文件
將生成的platform.keystore放在AndroidStudio創(chuàng)建的項目的app/路徑下
如圖編輯build.gradle文件:
android {signingConfigs {main {storeFile file("platform.keystore") //keystore文件路徑storePassword "password" //密鑰密碼keyAlias "yourname" //key別名keyPassword "password" //key密碼}}buildTypes {debug {minifyEnabled falsesigningConfig signingConfigs.mainproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}release {minifyEnabled falsesigningConfig signingConfigs.mainproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}
之后clean peoject之后重新build apk并且install,apk即可擁有platform簽名。
將編譯好的apk進(jìn)行系統(tǒng)簽名
首先確認(rèn)你的/build/make/target/product/security/
目錄下有.pem和.pk8的簽名文件,然后確認(rèn)有簽名工具prebuilts/sdk/tools/lib/signapk.jar
然后將你要簽名的apk放在在AOSP根目錄使用以下命令,替換app.apk為你的apk名,替換app_signed.apk為你想要簽完名的apk的名字。
java -Djava.library.path="prebuilts/sdk/tools/linux/lib64" -jar ./prebuilts/sdk/tools/lib/signapk.jar ./build/make/target/product/security/platform.x509.pem ./build/make/target/product/security/platform.pk8 app.apk app_signed.apk
參考
生產(chǎn)key:
Android系統(tǒng)簽名生成&Studio導(dǎo)入系統(tǒng)keystore
簽名key:
通過Android源碼對apk進(jìn)行簽名