Android签名生成和互转

原文链接:http://blog.votzone.com/2018/05/05/android_signature.html

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 12345678 -keystore testkey.jks -signedjar signed_out.apk 111.zip testkey

其中

-verbose 表示输出详细信息

-storepass 表示签名库的密码

-keystore 表示签名文件路径

-signedjar 表示签名后输出文件路径

最后跟需要签名的 文件路径 和 keystore 的别名

详细参数可以通过 jarsigner -help 查看,中文的还是很清楚。

2、signapk 是android 提供的单独为apk签名的工具,使用方法:

java -jar signapk.jar testkey.x509.pem testkey.pk8 111.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:12345678 -name testkey

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

会新生成 platform.p12

c)

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

使用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 12345678 -keystore testkey.jks -signedjar jks_out.apk 111.zip testkey

命令通过提供-stroepass(密码) 和别名(testkey) 将输入文件111.zip 签名为jks_out.apk

接下来我们提供一个将pk8签名生成jks的简易bat脚本, 脚本中需要配置 openssl keytool 路径,并且手动设置需要签名的文件名。

脚本见文章末尾github代码库中 cvt2jks.bat

工具运行目录如下

参考: https://blog.csdn.net/S_targaze_R/article/details/50739802

三、从将jks签名库中抽取pk8签名

openssl能够将signapk 用的签名合并到 jarsigner签名, 同样也可以分离出来,具体操作步骤:

a)

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

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

b)

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

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

-password pass:12345678 为了省略之后的输入密码步骤

通过网上的教程可知,如上代码同时导出了密钥 和 证书, 需要手动的将证书复制出来生成 .x509.pem签名

查看openssl帮助文档, 我们知道可以只导出证书或者密钥,于是我们可以通过 -nokeys 参数只导出证书

openssl pkcs12 -in testkey.p12 -nodes -nokeys -out testkey.x509.pem -password pass:12345678

通过-cacerts 参数之导出密钥

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

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 文件

参考 https://blog.csdn.net/sendwave/article/details/73699352

四、探究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 文件

参考 https://blog.csdn.net/darkengine/article/details/42773745

五、签名案例分析

创建一个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 为别名

脚本:

https://github.com/votzone/DroidCode/tree/master/Signature

原文地址:https://www.cnblogs.com/fog2012/p/android-signature-convert.html

时间: 2024-11-10 11:18:23

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

Mac Android签名生成keystore

1.打开终端 2.去到java安装的根目录,即输入 cd /Library/Java/Home/bin/ 3.当前用户没有最高权限,在Library文件夹下不能生成任何文件,可以到当前用户目录下生成文件 keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000 -keystore /Users/当前用户的用户名/android_demo.keystore 如果当前的用户名是xi

cmd命令生成android签名证书

cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书. 1.dos下进入JDK的bin目录 运行如下命令:keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore (-validity 20000代表有效期天数),命令完成后,bin目录中会生成android.keysto

Android 签名详解

在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个 permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应 用程序才能取得该权限.Android使用Java的数字证书相关的机制来 给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制.Android系统要求每一个

Android签名总结

一.为什么要签名 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的. 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换. APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉. 这样签名其实也是开发者的身份标识.交易中抵赖等事情发生时,签名可以防止抵赖的发生. 二.

Android签名机制之---签名过程具体解释

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.由于前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人改动你的apk,可是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们须要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

[转载] Android签名机制之—签名过程详解

本文转载自: http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/ 一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉

Android签名机制之---签名过程详解

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人修改你的apk,但是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们需要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

百度地图 Android签名证书的sha1值获取方式

百度地图安全码构成: Android签名证书的sha1值+";"+packagename(即:数字签名+分号+包名),例如: BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75;com.baidumap.demo 如果是app是debug版本(直接运行):可以在eclipse中直接查看:windows -> preferance -> android -> build 如下图示: 其中"SH

Android签名打包详解

一.      Android签名有什么作用? 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序.如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序.如果想升级应用程序,签名证书要相同,包名称要相同! 应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应