Android应用使用pem和pk8签名

Android应用使用到的签名文件,在不同应用场景会使用到不同文件格式的key:.keystore、.pem、*.pk8等。
这里一起罗列下,留个底。

1.生成key

密钥库类型:jks
密钥文件名:test1211.keystore
key store password:test1211
key alias:test1211
key password:test1211
有效期:100年

命令:keytool -genkey -v -keystore test1211.keystore -alias test1211 -keyalg RSA -validity 36500
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  Test1211
您的组织单位名称是什么?
  [Unknown]:  Test1211
您的组织名称是什么?
  [Unknown]:  Test1211
您所在的城市或区域名称是什么?
  [Unknown]:  ShenZhen
您所在的省/市/自治区名称是什么?
  [Unknown]:  GuangDong
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=Test1211, OU=Test1211, O=Test1211, L=ShenZhen, ST=GuangDong, C=CN是否正确?
  [否]:  y

正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 36,500 天):
         CN=Test1211, OU=Test1211, O=Test1211, L=ShenZhen, ST=GuangDong, C=CN
输入  的密钥口令
        (如果和密钥库口令相同, 按回车):
[正在存储test1211.keystore]
2.密钥库类型jks转为pkcs12

密钥库类型:pkcs12
密钥文件名:test1211-pkcs12.keystore
key store password:test1211
key password:test1211

特别说明:在进行转换时必须保证key store pwdkey pwd一致,不然会报错:
keytool 错误: java.security.UnrecoverableKeyException: Cannot recover key
修改密码,请参考下文10.修改密码

命令:keytool -importkeystore -srckeystore test1211.keystore -destkeystore test1211-pkcs12.keystore -deststoretype pkcs12
正在将密钥库 test1211.keystore 导入到 test1211-pkcs1211.keystore...
输入目标密钥库口令:
再次输入新口令:
输入源密钥库口令:
已成功导入别名 test1211 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
3.密钥库类型pkcs12转为jks

密钥库类型:jks
密钥文件名:test1211-jks.keystore
key store password:test1211
key password:test1211

命令:keytool -importkeystore -srckeystore test1211-pkcs12.keystore -destkeystore test1211-jks.keystore -deststoretype jks
正在将密钥库 test1211-pkcs12.keystore 导入到 test1211-jks.keystore...
输入目标密钥库口令:
再次输入新口令:
输入源密钥库口令:
已成功导入别名 test1211 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
4.查看key签名信息

查看jks和pkcs12的命令都一样,输入key store password的密码。
这里只是查看其中一个文件,你可以对比三个文件,证书指纹都是一致的。

命令:keytool -list -v -keystore test1211.keystore
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: test1211
创建日期: 2019-12-11
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=Test1211, OU=Test1211, O=Test1211, L=ShenZhen, ST=GuangDong, C=CN
发布者: CN=Test1211, OU=Test1211, O=Test1211, L=ShenZhen, ST=GuangDong, C=CN
序列号: 5c5ee261
有效期为 Wed Dec 11 10:49:56 CST 2019 至 Fri Nov 17 10:49:56 CST 2119
证书指纹:
         MD5:  43:D6:36:8C:44:1D:DE:78:51:58:AB:21:85:BE:33:9C
         SHA1: 41:AA:5F:D1:A2:E8:2C:7D:48:4E:8A:03:8A:2D:B3:36:30:EC:CE:A1
         SHA256: E4:33:51:ED:D0:A0:8D:30:33:31:81:A1:1C:5E:2C:64:39:99:72:56:DF:CF:8E:3A:5A:7A:16:D8:F9:83:26:30
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 85 CC 7D 2C 0B F1 14 C2   20 D7 B9 99 52 22 AE 42  ...,.... ...R".B
0010: B0 57 07 D2                                        .W..
]
]



*******************************************
*******************************************
5.将PKCS12格式的key dump为可直接阅读的文本

dump过程中也会提示输入密码,正确输入之后可阅读的token会存储在test1211.rsa.pem中
如果没安装openssl,点击下载

命令:openssl pkcs12 -in test1211-pkcs12.keystore -nodes -out test1211.rsa.pem
Enter Import Password:
MAC verified OK
6.提取密钥key

这一段(包含这两个tag)的文本复制出来,新建为文件my.x509.pem (签名时用到的公钥)

用文本编辑器打开test1211.rsa.pem,将从
-----BEGIN PRIVATE KEY-----
 到
-----END PRIVATE KEY-----

这一段(包含这两个tag)的文本复制出来,新建为文件my_private.rsa.pem

将从
-----BEGIN CERTIFICATE-----
 到
-----END CERTIFICATE-----
7.转换,生成pk8格式的私钥

这个生成的my_private.pk8就是签名时用到的私钥

命令:openssl pkcs8 -topk8 -outform DER -in my_private.rsa.pem -inform PEM -out my_private.pk8 -nocrypt
8.对apk签名
命令:java -jar signapk.jar my.x509.pem my_private.pk8 my.apk my_signed.apk
9.查看apk的签名信息
命令:keytool -list -printcert -jarfile my_signed.apk
10.修改密码

如果密码不一致,会导致jks和pkcs12互转时报错Cannot recover key
建议把key store password修改为与key password一致,如下命令:

命令:keytool -storepasswd -keystore test1211.keystore

参考1:Android 创建自己的pk8, x509.pem并给app签名
参考2:查看并修改签名证书keystore的密码,alias别名等相关参数

你可能感兴趣的:(Android应用使用pem和pk8签名)