1.签名文件简介
签名文件说明出处,标准的测试秘钥包含四个部分: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是没有指定特定秘钥的通用秘钥,可以用于开发阶段的普通apk签名(没有签名系统可能会在安装的时候就报错,不让安装)
- platform主要用于平台app做签名,例如某个平台app需要访问到@SystemApi或者@hide注解的方法,就需要使用platform文件来签名应用。
- shared 用于一些要共享数据应用数据的应用签名
- media 用于媒体和系统下载应用签名
2.签名文件的生成
2.1命令行生成方式
-
生成秘钥对:openssl genrsa -3 -out testkey.pem 2048
-
生成pem格式的证书: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脚本生成证书方式
在源码development/tools/目录中,有一个make_key脚本,可以使用这个脚本来生成证书
Step 1:cd到development/tools/目录
Step 2:运行make_key脚本: sudo ./make_key platform '/C=CN/ST=YourProvince/L=YourLocation/O=YourOrganization/OU=YourOrganizationalUnit/CN=YourName'
说明:testkey是生成的文件名,后面是证书里面的内容
参数 | 说明 |
---|---|
/C | 国家代号 |
/ST | 省份代号 |
/L | 位置代号 |
/O | 组织代号 |
/OU | 单位代号 |
/CN | 名称 |
Step 3:输入自定义密码
此时就会生成:platform.x509.pem和platform.pk8
此时就可以使用out/host/linux-x86/framework/目录下的signapk.jar包来对apk进行签名了
2.3 生成signapk.jar
- 在源码根目录使用source build/envsetup.sh创建指令环境
- 进入/build/tools/signapk/目录
- 执行指令:mm
- 在out/host/linux-x86/framework/目录找到signapk.jar
3.对apk进行签名
3.1 使用指令签名
如果使用原生的证书,目录在/build/target/product/security/中可以找到platform.pk8 platform.x509.pem文件,如果有我们上面生成的也可以。
将要打包的apk、证书和signapk.jar放到一个目录。
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk
3.2 使用Android Studio签名
要使用Android Studio对应用自动签名,需要生成.jks的证书,该二进制格式的证书,同时包含证书和私钥,一般有密码保护。
如果是没有密码的pem格式的证书生成.jks文件方式如下:
- 生成platform.pem文件
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem - 生成platform.p12文件,设置别名和密码,即AS打包APK时输入的别名和密码
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格式的证书生成.jks文件的方式:
假如密码是:c6a04bdc7236f5d18c75840f50dee482b36ad4cc
-
生成platform.pem文件
openssl pkcs8 -inform DER -passin pass:c6a04bdc7236f5d18c75840f50dee482b36ad4cc -in platform.pk8 -out platform.pem
-
生成platform.p12文件,设置别名和密码,即AS打包APK时输入的别名和密码
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文件之后,导入as中,编译工程的时候,选择Generate Signed Bundle or APK按照上面生成输入的昵称和密码一直下一步就可以完成工程签名了。
4.验证是否签名成功
- 将apk直接用zip等解压工具直接解压到本地目录
- 进入到META-INF目录找到:CERT.RSA文件
- 在META-INF目录打开控制台输入:keytool -printcert -file CERT.RSA 即可看到签名文件的输出
网友评论