Android签名,pem和pk8转化为jks

Android签名证书

  • 前因
  1. 最近更换了硬件设备,硬件厂商给了签名的pem,pk8,最新的版本没有给keystore,虽然现在使用jks了,实在没办法,就自己生成吧
  2. 在AndroidMenifest.xml配置sharedUserId需要系统签名
android:sharedUserId="android.uid.system"
  • 目前获取系统权限的方法
3. platform签名
4. root固件 (有su)
5. 调用厂商封装好的系统权限的sdk
  • 我们对第一点,做下记录,那么会拿到厂商提供的以下两个文件

【Android】Android签名:pem和pk8转化为keystore,jks_android签名
​​​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

  • 准备工作
  1. openssl (需下载安装)
  2. platform.pk8 & platform.x509.pem (厂商提供)
  3. keytool (jdk自带,默认已安装jdk)
  • openssl安装
  1. 下载 openssl

​1. 官网,无Windows版本​
​2. 镜像,有Windows版本​
【Android】Android签名:pem和pk8转化为keystore,jks_android签名_02

  • 这里给大家排个坑

首先对应好你的编译APP的JDK版本,如果是JDK8,就下载1.1.1,
如果是高的版本就下载3.0.0,不然你的JDK8keytool识别不了

  1. 配置系统环镜变量
    【Android】Android签名:pem和pk8转化为keystore,jks_android_03

JKS签名生成

主要分三步

  1. pk8 私钥解密pem格式
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt
  1. 私钥通过公钥pem加密pk12, 需要输入两次密码
openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name [别名]
  1. 通过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.signconfig
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
signingConfig signingConfigs.signconfig
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
  • Bingo,现在Android Studio 调试安装都是platform签名后的apk

扩展 jks 转pem/pk8

主要分五步

  1. java keytool 转成 pkcs12格式
keytool   -importkeystore -srckeystore debug.keystore   -destkeystore tmp.p12 -srcstoretype JKS         -deststoretype PKCS12
  1. pkcs12 dump pem格式
openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem

dump的文件格式

Bag Attributes
friendlyName: [别名]
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 Attributes
friendlyName: [别名]
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-----
  1. 复制“BEGIN CERTIFICATE” “END CERTIFICATE” 到(新建个文件) cert.x509.pem

dos命令不好实现,建议采用bash

grep -zoe '-----BEGIN CERTIFICATE-----.*-----END CERTIFICATE-----' tmp.rsa.pem>cert.x509.pem
  1. 复制 “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
  1. 生成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​