栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

【Android】Android签名:pem和pk8转化为keystore,jks

Java 更新时间:发布时间: 百科书网 趣学号

Android签名,pem和pk8转化为jks
  • Android签名证书
  • Android签名JKS
  • JKS签名生成
  • How to use
  • 扩展 jks 转pem/pk8

Android签名证书
  • 前因
  1. 最近更换了硬件设备,硬件厂商给了签名的pem,pk8,最新的版本没有给keystore,虽然现在使用jks了,实在没办法,就自己生成吧
  2. 在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
  • 准备工作
  1. openssl (需下载安装)
  2. platform.pk8 & platform.x509.pem (厂商提供)
  3. keytool (jdk自带,默认已安装jdk)
  • openssl安装
  1. 下载 openssl

1. 官网,无Windows版本
2. 镜像,有Windows版本

  • 这里给大家排个坑

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

  1. 配置系统环镜变量

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: 
-----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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/602190.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号