Android 的签名有两种方式,一种使用jdk 提供的jarsigner工具签名keystore 文件,另一种是Android 自己提供的signapk.jar 通过.pk8(密钥) 和.x509.pem(证书)两个签名文件完成签名。
 
之前对一个包签名都是直接使用signapk来的,因为不需要输入密码即可直接签名,简单直接,今天上传百度时遇到问题了,下载下来签名说明文档后说需要使用jarsigner 来签名,于是研究了下两个签名之间相互转换的问题。
并且为了降低以后再次遇到这类问题时查找资料的成本,写了个简易的bat脚本半自动化操作。
 
工具:
openssl 安装完成之后, 将bin目录加入环境变量即可使用openssl
keytool jdk/bin目录下的工具
signapk.jar 用于Android签名的工具(源码在aosp的源代码下)
jarsigner jdk 中的工具,用于给jar签名(也可以给任意一个zip包签名)
 
 
一、两种不同签名方案的签名过程
1、jarsigner 是jdk 提供的工具,安装jdk之后就可以使用了,使用jarsigner签名的命令如下:
 
jarsigner -verbose -storepass  -keystore testkey.jks -signedjar signed_out.apk .zip testkey
其中
-verbose 表示输出详细信息
-storepass 表示签名库的密码
-keystore 表示签名文件路径
-signedjar 表示签名后输出文件路径
最后跟需要签名的 文件路径 和 keystore 的别名
详细参数可以通过 jarsigner -help 查看,中文的还是很清楚。
 
2、signapk 是android 提供的单独为apk签名的工具,使用方法:
java -jar signapk.jar testkey.x509.pem testkey.pk8 .zip signed_out.apk
可知,jarsigner 签名需要提供一个签名文件jks 和签名库密码,并且如果签名库密码跟密钥密码不同还需另外提供密钥密码;(下文我们称jks 签名或jks签名库)
signapk 签名只需提供一个pk8文件和一个x509.pem文件即可。(下文将这两个文件简称为pk8签名)
 
二、将pk8签名转换为jks 签名库
接下来我们解决百度渠道的签名问题,第一步就需要将我们的pk8签名 转换为 jks签名。
通过网上搜索,我们了解到java签名库文件通常的后缀有.keystore 和.jks,因此我们可以认为之前eclipse时代的.keystore签名与Android Studio 时代的.jks 签名是相同格式的。
 
现在我们有pk8签名,可以使用openssl 和keytool 两个工具来将其合并到jks签名库
下面以实例介绍将testkey.pk8/testkey.x509.pem 签名文件 合并到testkey.jks 签名库,并设置其密码12345678和别名testkey
 
a)

openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem

使用 open ssl 将pk8 解密为 pem 文件, 此时生成一个testkey.pem 文件

b)

openssl pkcs12 -export -in testkey.x509.pem -inkey testkey.pem -out platform.p12 -password pass: -name testkey

将两个pem 文件导入platform.p12文件中,并设置 别名 testkey 和keypass 密码:12345678 (别名和密码可自定义)

会新生成 platform.p12
 
c)

keytool -importkeystore -deststorepass  -destkeystore testkey.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass 

使用keytool 将之前生成的platform.p12导入 testkey.jks 签名中,并设置storepass密码(12345678)

需要正确提供keypass 密码
此时即生成了需要的testkey.jks 签名文件
 
d)

keytool -list -v -keystore testkey.jks

查看生成的 签名信息

 
注意: storepass 和 keypass 可以不同
两个密码相同情况下 使用jarsigner 签名时只需提供storepass即可
否则需要提供两个密码
keytool -list 查看时只需提供storepass即可
 
有了jks签名库,我们为空包签名
jarsigner -verbose -storepass  -keystore testkey.jks -signedjar jks_out.apk .zip testkey
命令通过提供-stroepass(密码) 和别名(testkey) 将输入文件111.zip 签名为jks_out.apk
 
接下来我们提供一个将pk8签名生成jks的简易bat脚本, 脚本中需要配置 openssl keytool 路径,并且手动设置需要签名的文件名。
脚本见文章末尾github代码库中 cvt2jks.bat
 
工具运行目录如下
 
 
三、从将jks签名库中抽取pk8签名
 
openssl能够将signapk 用的签名合并到 jarsigner签名, 同样也可以分离出来,具体操作步骤:
 
a)

keytool -importkeystore -srckeystore testkey.jks -destkeystore testkey.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass  -deststorepass  -noprompt

首先将testkey.jks 转化为 .p12文件, 在执行过程中需要输入srcstore密码和 deststroe 密码, 这里在命令行中 通过-srcstorepass 和-deststorepass指定

 
b)

openssl pkcs12 -in testkey.p12 -nodes -out testkey_all.rsa.pem -password pass:

使用openssl 的pkcs12 指令将p12文件中的证书导出,

-password pass:12345678 为了省略之后的输入密码步骤
 
通过网上的教程可知,如上代码同时导出了密钥 和 证书, 需要手动的将证书复制出来生成 .x509.pem签名
查看openssl帮助文档, 我们知道可以只导出证书或者密钥,于是我们可以通过 -nokeys 参数只导出证书
openssl pkcs12 -in testkey.p12 -nodes -nokeys -out testkey.x509.pem -password pass:
通过-cacerts 参数之导出密钥
openssl pkcs12 -in testkey.p12 -nodes -cacerts -out testkey.rsa.pem -password pass:
c) 根据b)中生成的密钥文件生成pk8, 可以使用testkey_all.rsa.pem 也可是使用testkey.rsa.pem
openssl pkcs8 -topk8 -outform DER -in testkey.rsa.pem -inform PEM -out testkey.pk8 -nocrypt
如上testkey.pk8 和 testkey.x509.pem即为所需签名
 
一个简易bat 脚本
见文章末尾github代码库中 jks2pk8.bat 文件
 
 
四、探究jks 签名的生成
我们知道可以使用Android Studio 来生成jks, 是不是有命令行工具呢
keytool 就可以实现 这个操作
核心命令 keytool -genkey -v -keystore app.jks -alias app -keyalg RSA -validity 999999
如上,指定了 要生成的签名文件名称 , 别名 和有效期(日)
运行过程中需要输入两个密码 一个是密码口令(keypass),一个是密钥库口令(storepass)
可以通过-keypass 和 -storepass 指定
 
简易 bat脚本
见文章末尾github代码库中 genkey.bat 文件
 
 
五、签名案例分析
创建一个jks 签名app.jks, 将jks 签名拆分为signapk需要的pk8签名, 然后再将pk8 签名合并回jks
分别用如上三个签名对同意文件进行签名操作, 对比如下: 证书都相同!
 
 
 
PS:附使用 signapk.jar 和jarsigner 工具签名的命令行操作
signapk.jar 签名示例
java -jar signapk.jar testkey.x509.pem testkey.pk8 111.zip jifei_out.apk
 
jarsigner 工具签名示例
jarsigner -verbose -storepass 12345678 -keystore testkey.jks -signedjar jks_out.apk 111.zip testkey
最后的testkey 为别名
 
脚本:

Android签名生成和互转的更多相关文章

  1. android签名生成和发布

    首先,我们需要一个keystore,当然已经有了的话就不用这一步了:cmd下:进入到jdk的bin目录,这样的话,android.keystore文件就会生成在这个目录下,签名的时候我们需要这个文件C ...

  2. android 签名生成和签名验证

    keytool -genkey -alias lingni -keyalg RSA -validity -keystore lingni.keystore -alias 是别名 lingni.keys ...

  3. Mac Android签名生成keystore

    1.打开终端 2.去到java安装的根目录,即输入 cd /Library/Java/Home/bin/ 3.当前用户没有最高权限,在Library文件夹下不能生成任何文件,可以到当前用户目录下生成文 ...

  4. cmd命令生成android签名证书

    cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书. 1.dos下进入JDK的bin目录 运行如下命令 ...

  5. Android APK生成证书并签名方法

    Android APK生成证书并签名方法 android cordova keystore android证书签名 阅读:925 时间:2018年09月20日 Android开发者可能对此很熟悉.使用 ...

  6. Android集成微信分享功能应用签名生成方法及分享不生效的问题

    通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...

  7. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  8. Android 签名证书

    Android APK的数字签名的作用和意义 http://blog.csdn.net/gaomatrix/article/details/6568191 http://jingyan.baidu.c ...

  9. Android签名机制

    Android APK 签名比对 发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的.签名机制在Android应用和框架中有着十分重要的作用. 例如,Android系 ...

随机推荐

  1. BZOJ P1212 [HNOI2004] L语言

    标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的集合. 我 ...

  2. RabbitMq、ActiveMq、ZeroMq、kafka各个消息中间件之间的区别

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求. 第一部分:RabbitMQ,ActiveMq, ...

  3. Node.js学习(篇章一)

    <node.js的特点> 采用了异步式I/O与事件驱动的架构设计,架构为单线程模型. <supervisor包的作用> node.js开发项目,当修改项目时,需要终止进程重启N ...

  4. LintCode2016年8月8日算法比赛----子树

    子树 题目描述 有两个不同大小的二叉树:T1有上百万的节点:T2有好几百的节点.请设计一种算法,判定T2是否为T1的子树. 注意事项 若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 ...

  5. How to fix Mysql table crashes

    Whenever you enconter this: Please use mysql_upgrade to fix this error. or using  mysql_upgrade -u r ...

  6. intelliJ IDEA 怎么添加本地的idea web项目

    概述:这篇文章主要讲述idea开发工具怎么添加本地的idea web项目. 一:首先介绍一下idea web项目的目录结构: 上图详细简单的说了一下idea web项目的文件情况. 二:说明一下部署本 ...

  7. HandlerThread使用

    HandlerThread 是一个包含 Looper 的 Thread,我们可以直接使用这个 Looper 创建 Handler.  1.HandlerThread 源码 public class H ...

  8. ZABBIX 2.1.0 发布,分布式系统监控

    ZABBIX 2.1.0 发布了,这相当是 ZABBIX 2.2 的首个 Alpha 版本,包括了新的主要的功能和改进. 主要包括如下几个方面的提升: 性能提升 可加载模块 移除对未知事件的支持 应用 ...

  9. php foreach 报 “Cannot create references to elements of a temporary array expression”

    今天在项目中用php foreach数据库查询结果时,为了方便没有判断数据是否存在,直接用(array)强制转换数据时,刚开始网页始终打不开,就报502,一头懵,突然间php报“Cannot crea ...

  10. SQL点点滴滴_判断字段或者字符中是否包含有特殊字符

    SQL Server中,如果我们想判断一个字符串或者数据字段中是否包含有特殊字符.可以使用正则来实现.除了大小字母和数字之外全是特殊字符[^a-zA-Z0-9]