雪落的小屋

Android签名Key的生成与使用

2023-10-17折腾笔记编程脚本Android

平时一直有客户索要平台 key 来进行客户 APP 的开发,同时项目在进行 GMS 认证的过程中,也是需要生成并替换掉默认 Key 的,否则无法通过 CTS 的测试,自己也写了一个脚本来快速对 APP 进行签名,故记录一下。

手动生成密钥

# 如果没有密钥可以先创建一个,有就直接用现有的
openssl genpkey -algorithm RSA -out key_rsa2048.pem -aes256

手动根据私钥生成 X509 和 PK8 密钥

openssl pkcs8 -topk8 -inform PEM -outform DER -in key_rsa2048.pem -out platform.pk8 -nocrypt
 
# 直接回车就好
openssl req -key key_rsa2048.pem -new -x509 -out platform.x509.pem

通过平台脚本生成 PEM

# Generate .rnd file
cd ~
openssl rand -writerand .rnd
cd -
# Generate the release key
development/tools/make_key releasekey '/C=CN/ST=Shenzhen/L=BaoAn/O=Shiro/OU=Shiro/CN=Shiro/emailAddress=me@Shiro.La'

通过 PK8 密钥生成 KeyStore

# 服务器上进入对于目录执行
# AOSP build\target\product\security
# MTK device\mediatek\security
 
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
 
openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p8 -password pass:android -name android
 
keytool -importkeystore -deststorepass android -destkeystore .keystore -srckeystore platform.p8 -srcstoretype PKCS12 -srcstorepass android
 
keytool -list -v -keystore .keystore
 
mv .keystore mtk.keystore
 
openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem
 
openssl pkcs12 -export -in testkey.x509.pem -inkey testkey.pem -out testkey.p8 -password pass:android -name android
 
keytool -importkeystore -deststorepass android -destkeystore .keystore -srckeystore testkey.p8 -srcstoretype PKCS12 -srcstorepass android
 
keytool -list -v -keystore .keystore
 
mv .keystore testkey.keystore

把 Keystore 转换成 Jks

# 得配置好JDK环境变量先
keytool -importkeystore -srckeystore platform.keystore -destkeystore platform.p12 -deststoretype PKCS12
keytool -importkeystore -srckeystore platform.p12 -destkeystore platform.jks -deststoretype pkcs12
 
keytool -importkeystore -srckeystore mtk.keystore -destkeystore mtk.p12 -deststoretype PKCS12
keytool -importkeystore -srckeystore mtk.p12 -destkeystore mtk.jks -deststoretype pkcs12

生成 AVB_PUBKEY

如果要进行 GMS 认证的话,最好还是把 avbkey 一并替换了,

替换完毕之后,还要手动测试一下:

run cts -m CtsAppSecurityHostTestCases -t android.appsecurity.cts.ApexSignatureVerificationTest#testApexPubKeyIsNotWellKnownKey
development/tools/make_key com.android.runtime '/C=CN/ST=Shenzhen/L=BaoAn/O=Shiro/OU=Shiro/CN=Shiro/emailAddress=me@Shiro.La'
 
openssl genrsa -out com.android.runtime.pem 4096
avbtool extract_public_key --key com.android.runtime.pem --output com.android.runtime.avbpubkey

实际替换的全部的签名文件列表:

bionic/apex/com.android.runtime.avbpubkey
bionic/apex/com.android.runtime.pem
bionic/apex/com.android.runtime.pk8
bionic/apex/com.android.runtime.x509.pem
build/make/target/product/security/bluetooth.pk8
build/make/target/product/security/bluetooth.x509.pem
build/make/target/product/security/cts_uicc_2021.pk8
build/make/target/product/security/cts_uicc_2021.x509.pem
build/make/target/product/security/media.pk8
build/make/target/product/security/media.x509.pem
build/make/target/product/security/networkstack.pk8
build/make/target/product/security/networkstack.x509.pem
build/make/target/product/security/platform.pk8
build/make/target/product/security/platform.x509.pem
build/make/target/product/security/sdk_sandbox.pk8
build/make/target/product/security/sdk_sandbox.x509.pem
build/make/target/product/security/shared.pk8
build/make/target/product/security/shared.x509.pem
build/make/target/product/security/testkey.pk8
build/make/target/product/security/testkey.x509.pem
packages/modules/RuntimeI18n/apex/com.android.i18n.avbpubkey
packages/modules/RuntimeI18n/apex/com.android.i18n.pem
packages/modules/RuntimeI18n/apex/com.android.i18n.pk8
packages/modules/RuntimeI18n/apex/com.android.i18n.x509.pem

签名 Bat 脚本

需要把 zipalign.exeapksigner.jar 放到同一目录下,

这两个文件可以从 Android SDK 的 build-tools 中找到,

必须要有 Java 环境并且配置好环境变量,

通过前文的步骤生成 .jks 格式的密钥,

然后把脚本保存为 sign.bat 和前者放在一起,把待签名的 APK 也放在同一目录,

然后把 APK 拖到脚本的图标上面即可。

@echo off
title APK Signer by RinShiro
SETLOCAL ENABLEDELAYEDEXPANSION
Color 3f
rem change KeyStorePath ALIAS_NAME STORE_PASS KEY_PASS
Set KeyStorePath="mtk.jks"
Set ALIAS_NAME="android"
Set STORE_PASS="android"
Set KEY_PASS="android"
Set ZIP_ALIGN="zipalign.exe"
Set APKSIGNER_PATH="apksigner.jar"
 
rem apk file name check
SET CLASSPATH=%1
Set FILE_PATH=%~dp1%~n1
Set FILE_NAME=%~nx1
Set FILE_DIR=%~dp1
Set ZIPALIGNED_PATH="%FILE_PATH%.zipaligned.apk"
Set SIGNED_FILE="%FILE_PATH%.signed.apk"
 
 
If %~x1==.apk (
	echo  apk file name check
	echo   - %CLASSPATH%
	echo  apk zipalign
	zipalign -f -v 4 "%CLASSPATH%" "%ZIPALIGNED_PATH%"
	echo.
	echo.
	Echo  apk zipalign signer
	echo   - %ZIPALIGNED_PATH%
	echo.
	echo.
	echo  apk signing
	echo.
	echo.
	java -jar %APKSIGNER_PATH% sign -v --out "%SIGNED_FILE%" --ks %KeyStorePath% --ks-pass pass:%STORE_PASS% --key-pass pass:%KEY_PASS% --ks-key-alias %ALIAS_NAME% "%ZIPALIGNED_PATH%" 
	Color 0C
	echo.
	echo.
	echo.
	echo  please check the console output
	Echo  if the console output has no error, the signature is successful
	Pause>nul
	Color 3f
	echo.
	echo.
	Echo  verify signature
	echo   - %SIGNED_FILE%
	echo.
	java -jar %APKSIGNER_PATH% verify -v --print-certs "%SIGNED_FILE%" | more
	echo.
	echo.
	echo  apk signing completed
	Pause>nul
	exit
)
 
echo  not a valid apk file
echo   - %CLASSPATH%
echo.
echo.
echo  exit
Pause>nul
endlocal
exit