1.簽名文件簡(jiǎn)介
簽名文件說(shuō)明出處,標(biāo)準(zhǔn)的測(cè)試秘鑰包含四個(gè)部分:testkey、platform、shared和media。
The following standard test keys are currently included:
testkey -- a generic key for packages that do not otherwise specify a key.
platform -- a test key for packages that are part of the core platform.
shared -- a test key for things that are shared in the home/contacts process.
media -- a test key for packages that are part of the media/download system.
- testkey是沒(méi)有指定特定秘鑰的通用秘鑰,可以用于開(kāi)發(fā)階段的普通apk簽名(沒(méi)有簽名系統(tǒng)可能會(huì)在安裝的時(shí)候就報(bào)錯(cuò),不讓安裝)
- platform主要用于平臺(tái)app做簽名,例如某個(gè)平臺(tái)app需要訪問(wèn)到@SystemApi或者@hide注解的方法,就需要使用platform文件來(lái)簽名應(yīng)用。
- shared 用于一些要共享數(shù)據(jù)應(yīng)用數(shù)據(jù)的應(yīng)用簽名
- media 用于媒體和系統(tǒng)下載應(yīng)用簽名
2.簽名文件的生成
2.1命令行生成方式
生成秘鑰對(duì):openssl genrsa -3 -out testkey.pem 2048
生成pem格式的證書(shū):openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
生成私鑰文件:openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
2.2腳本生成證書(shū)方式
在源碼development/tools/目錄中,有一個(gè)make_key腳本,可以使用這個(gè)腳本來(lái)生成證書(shū)
Step 1:cd到development/tools/目錄
Step 2:運(yùn)行make_key腳本: sudo ./make_key platform '/C=CN/ST=YourProvince/L=YourLocation/O=YourOrganization/OU=YourOrganizationalUnit/CN=YourName'
說(shuō)明:testkey是生成的文件名,后面是證書(shū)里面的內(nèi)容
| 參數(shù) | 說(shuō)明 |
|---|---|
| /C | 國(guó)家代號(hào) |
| /ST | 省份代號(hào) |
| /L | 位置代號(hào) |
| /O | 組織代號(hào) |
| /OU | 單位代號(hào) |
| /CN | 名稱(chēng) |
Step 3:輸入自定義密碼
此時(shí)就會(huì)生成:platform.x509.pem和platform.pk8
此時(shí)就可以使用out/host/linux-x86/framework/目錄下的signapk.jar包來(lái)對(duì)apk進(jìn)行簽名了
2.3 生成signapk.jar
- 在源碼根目錄使用source build/envsetup.sh創(chuàng)建指令環(huán)境
- 進(jìn)入/build/tools/signapk/目錄
- 執(zhí)行指令:mm
- 在out/host/linux-x86/framework/目錄找到signapk.jar
3.對(duì)apk進(jìn)行簽名
3.1 使用指令簽名
如果使用原生的證書(shū),目錄在/build/target/product/security/中可以找到platform.pk8 platform.x509.pem文件,如果有我們上面生成的也可以。
將要打包的apk、證書(shū)和signapk.jar放到一個(gè)目錄。
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk
3.2 使用Android Studio簽名
要使用Android Studio對(duì)應(yīng)用自動(dòng)簽名,需要生成.jks的證書(shū),該二進(jìn)制格式的證書(shū),同時(shí)包含證書(shū)和私鑰,一般有密碼保護(hù)。
如果是沒(méi)有密碼的pem格式的證書(shū)生成.jks文件方式如下:
- 生成platform.pem文件
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem - 生成platform.p12文件,設(shè)置別名和密碼,即AS打包APK時(shí)輸入的別名和密碼
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:android -name key - 生成platform.jks(鑰匙文件) (-srcstorepass android)是.jks文件的密碼
keytool -importkeystore -deststorepass android -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass android
有密碼的pem格式的證書(shū)生成.jks文件的方式:
假如密碼是:c6a04bdc7236f5d18c75840f50dee482b36ad4cc
-
生成platform.pem文件
openssl pkcs8 -inform DER -passin pass:c6a04bdc7236f5d18c75840f50dee482b36ad4cc -in platform.pk8 -out platform.pem
-
生成platform.p12文件,設(shè)置別名和密碼,即AS打包APK時(shí)輸入的別名和密碼
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:android -name key
-
生成platform.jks(鑰匙文件) (-srcstorepass android)是.jks文件的密碼
keytool -importkeystore -deststorepass android -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass android
生成.jks文件之后,導(dǎo)入as中,編譯工程的時(shí)候,選擇Generate Signed Bundle or APK按照上面生成輸入的昵稱(chēng)和密碼一直下一步就可以完成工程簽名了。
4.驗(yàn)證是否簽名成功
- 將apk直接用zip等解壓工具直接解壓到本地目錄
- 進(jìn)入到META-INF目錄找到:CERT.RSA文件
- 在META-INF目錄打開(kāi)控制臺(tái)輸入:keytool -printcert -file CERT.RSA 即可看到簽名文件的輸出
