Android签名,pem和pk8转化为jks
- Android签名证书
- Android签名JKS
- JKS签名生成
- How to use
- 扩展 jks 转pem/pk8
Android签名证书
- 前因
- 最近更换了硬件设备,硬件厂商给了签名的pem,pk8,最新的版本没有给keystore,虽然现在使用jks了,实在没办法,就自己生成吧
- 在AndroidMenifest.xml配置sharedUserId需要系统签名
android:sharedUserId="android.uid.system"
- 目前获取系统权限的方法
3. platform签名
4. root固件 (有su)
5. 调用厂商封装好的系统权限的sdk
- 我们对第一点,做下记录,那么会拿到厂商提供的以下两个文件
platform.pk8
保存private key 加密
platform.x509.pem
X.509证书 存储数字证书,公钥信息还能存各种key
- 但是这两种文件不能直接进行签名,需要调用对App签名
java -jar signapk.jar platform.x509.pem platform.pk8 [old].apk [new].apk
- 对于这种方式
需要先生成apk,输入命令签名,再使用adb安装
调试
非常不方便,故想将pk8 和pem转成通用的jks或者keystore的签名
Note:
android一般除了使用jarsigner签名,还有使用signapk 后者位于android源码,前者位于jdk中。两者使用的文件格式不同前者使用JKS,后者使用公钥+私钥是分开的
Android签名JKS
- 准备工作
- openssl (需下载安装)
- platform.pk8 & platform.x509.pem (厂商提供)
- keytool (jdk自带,默认已安装jdk)
- openssl安装
- 下载 openssl
1. 官网,无Windows版本
2. 镜像,有Windows版本
- 这里给大家排个坑
首先对应好你的编译APP的JDK版本,如果是JDK8,就下载1.1.1,
如果是高的版本就下载3.0.0,不然你的JDK8keytool识别不了
- 配置系统环镜变量
JKS签名生成
主要分三步
- pk8 私钥解密pem格式
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt
- 私钥通过公钥pem加密pk12, 需要输入两次密码
openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name [别名]
- 通过java的keytool 工具生成 keystore, 别名需要跟步骤2的一致,同样输入两次密码
jks
keytool -importkeystore -destkeystore platform.jks -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass [密码] -alias [别名]
keystore
keytool -importkeystore -destkeystore platform.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass [密码] -alias [别名]
- 在这里我遇到了一个小坑
keytool 错误: java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)
解决方案: 使用jdk16的keytool
How to use
- 项目使用jks
android {signingConfigs {MySignName {keyAlias "[别名]"keyPassword "[密码]"storeFile file('[jks路径]')storePassword "[密码]"}}buildTypes {debug {signingConfig signingConfigs.MySignName}release{signingConfig signingConfigs.MySignName}}
}
Example:
signingConfigs {signconfig {keyAlias 'platform'keyPassword 'android'storeFile file('../app/platform.jks')storePassword 'android'}
}buildTypes {debug {signingConfig signingConfigs.signconfigminifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}release {signingConfig signingConfigs.signconfigminifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}
}
- Bingo,现在Android Studio 调试安装都是platform签名后的apk
扩展 jks 转pem/pk8
主要分五步
- java keytool 转成 pkcs12格式
keytool -importkeystore -srckeystore debug.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12
- pkcs12 dump pem格式
openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem
dump的文件格式
Bag AttributesfriendlyName: [别名]localKeyID: 54 69 6D 65 20 31 35 37 31 38 39 30 30 31 35 30 30 30
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----
Bag AttributesfriendlyName: [别名]localKeyID: 54 69 6D 65 20 31 35 37 31 38 39 30 30 31 35 30 30 30
subject=C = US, ST = California, L = Mountain View, O = Android, OU = Android, CN = Android, emailAddress = android@android.com
issuer=C = US, ST = California, L = Mountain View, O = Android, OU = Android, CN = Android, emailAddress = android@android.com-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
- 复制“BEGIN CERTIFICATE” “END CERTIFICATE” 到(新建个文件) cert.x509.pem
dos命令不好实现,建议采用bash
grep -zoe '-----BEGIN CERTIFICATE-----.*-----END CERTIFICATE-----' tmp.rsa.pem>cert.x509.pem
- 复制 “BEGIN RSA PRIVATE KEY” “END RSA PRIVATE KEY” 到(同上) private.rsa.pem
dos命令不好实现,建议采用bash
grep -zoe '-----BEGIN CERTIFICATE-----.*-----END CERTIFICATE-----' tmp.rsa.pem>private.rsa.pem
- 生成pk8格式的私钥
openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt
- 至此已经生成pem pk8 格式的两个签名文件
参考
Android签名证书 keystore jks pem x509
pk8/x509.pem转换为keystore