1.安卓簽名和密鑰
Android OS 映像在兩個(gè)地方使用加密簽名:
- 映像中的所有 .apk 文件都必須經(jīng)過(guò)簽名。Android 軟件包管理器通過(guò)下列兩種方式使用 .apk 簽名:
- 更換應(yīng)用時(shí),必須使用與舊應(yīng)用相同的密鑰對(duì)其簽名,才能存取舊應(yīng)用的數(shù)據(jù)。無(wú)論是通過(guò)覆蓋 .apk 來(lái)更新用戶(hù)應(yīng)用,還是使用安裝在
/data下的新版本應(yīng)用來(lái)覆蓋系統(tǒng)應(yīng)用,這一點(diǎn)都適用。 - 如果兩個(gè)或多個(gè)應(yīng)用想要共享同一個(gè)用戶(hù) ID(方便共享數(shù)據(jù)等),則必須使用相同的密鑰對(duì)它們進(jìn)行簽名。
- 更換應(yīng)用時(shí),必須使用與舊應(yīng)用相同的密鑰對(duì)其簽名,才能存取舊應(yīng)用的數(shù)據(jù)。無(wú)論是通過(guò)覆蓋 .apk 來(lái)更新用戶(hù)應(yīng)用,還是使用安裝在
- 必須使用符合系統(tǒng)預(yù)期的密鑰對(duì) OTA 更新包進(jìn)行簽名,否則在安裝過(guò)程中 OTA 更新包將被拒絕。
標(biāo)準(zhǔn)安卓使用四對(duì)密鑰,分別是:
testkey: 適用于未另外指定密鑰的 apk 包的通用默認(rèn)密鑰。(如果app的Android.mk中LOCAL_CERTIFICATE未設(shè)置,則默認(rèn)會(huì)采用testkey)
platform: 適用于核心平臺(tái)所包含的 apk 包的測(cè)試密鑰。
shared: 適用于家庭/聯(lián)系人進(jìn)程中的共享內(nèi)容的測(cè)試密鑰。(apk需要和home/contacts共享數(shù)據(jù))
Meida: 適用于媒體/下載系統(tǒng)所包含的 apk 包的測(cè)試密鑰。(apk是media/download系統(tǒng)中的一環(huán))
除testkey以外,其他密鑰需要在App的Android.mk中明確指定LOCAL_CERTIFICATE。
以上提到的四對(duì)密鑰默認(rèn)在build/target/product/security目錄,每種密鑰包含兩個(gè)文件:一個(gè)擴(kuò)展名為.x509.pem的證書(shū),一個(gè)擴(kuò)展名為.pk8的私鑰。以platform為例,則會(huì)有platform.x509.pem和platform.pk8兩個(gè)文件。
需要注意的是:以上密鑰都是默認(rèn)密鑰,也就是說(shuō)用戶(hù)需要自己生成密鑰才能保證安全性。
根據(jù)安卓官方的聲明,還可使用以下方式對(duì)單個(gè)apk通過(guò)路徑名指定不同的密鑰,比如:
device/yoyodyne/apps/SpecialApp/Android.mk
[...]
LOCAL_CERTIFICATE := device/yoyodyne/security/special
現(xiàn)在,此版本使用 device/yoyodyne/security/special.{x509.pem,pk8} 密鑰來(lái)對(duì) SpecialApp.apk 進(jìn)行簽名。此版本僅可使用不受密碼保護(hù)的私鑰
2.密鑰生成
根據(jù)安卓官方推薦,使用以下命令生成新的密鑰:
subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
我們可將subject中的內(nèi)容替換為公司的信息。這樣在android-certs中會(huì)生成四對(duì)密鑰:releasekey/platform/share/media。
生成key的過(guò)程中會(huì)提示輸入password, 可以不輸入,避免編譯過(guò)程中要求密碼輸入。
可將生成的密鑰拷貝到build/target/product/security目錄覆蓋掉原有的默認(rèn)密鑰。
3. Makefile修改
為了使用releasekey替換掉testkey,需要修改以下Makefile文件:
- 在buid/core/config.mk中定義變量:DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey
- ./system/sepolicy/prebuilts/api/26.0/private/keys.conf
./system/sepolicy/private/keys.conf中將testkey修改為releasekey。
4. 手動(dòng)簽名image
如果需要對(duì)OTA image手動(dòng)簽名,可以使用以下命令:
./build/tools/releasetools/ota_from_target_files
-k ~/.android-certs/releasekey \ --簽名key
signed-target_files.zip \ --輸入文件,已經(jīng)簽過(guò)名
signed-ota_update.zip --輸出文件,重簽名文件
那么,如何得到OTA image對(duì)應(yīng)的ROM image呢?可以使用以下命令生成:
./build/tools/releasetools/img_from_target_files signed-target-files.zip signed-img.zip
生成的signed-img.zip就包含所有的.img文件??捎胒astboot加載到設(shè)備:
fastboot update singed-img.zip
更多信息可參考安卓官方介紹:https://source.android.com/devices/tech/ota/sign_builds.html