你可能想知道 通过这篇博客可以解决哪些问题以及学到什么:

1.公司开发一个新的app,如何创建一个应用签名?

2.为了安全性,Android系统不想使用Google给的原生签名,如何定制系统签名?

这篇博客介绍了如何制作签名文件,首先介绍Android开发中使用到的签名文件类型,然后介绍系统签名如何制作,最后介绍不同IDE用到的签名文件如何制作。

目录

一、Android的签名文件有三种类型,分别在以下情况使用

1.  jks: 用于Android Studio编译

2.  keystore: 用于Eclipse编译

3.  pk8/x509.pem   : 用于Android系统的编译

二、制作pk8/x509.pem格式系统签名文件

1.准备环境

2.制作过程

3.使用自定义签名

4.检查自定义签名

三、制作jks格式的签名文件

四、制作keystore格式的签名文件


一、Android的签名文件有三种类型,分别在以下情况使用

1.  jks: 用于Android Studio编译

全称为Java key store,jks也是Android Studio中创建签名文件的格式

2.  keystore: 用于Eclipse编译

最早开发Android的时候的签名文件,目前开发Android都使用AS,而AS也兼容keystore.

3.  pk8/x509.pem   : 用于Android系统的编译

这个是系统的签名文件,同样也可以给APK签名

二、制作pk8/x509.pem格式系统签名文件

1.准备环境

需要在linux系统中,且有编译Android源码的环境

2.制作过程

1)生成签名文件

要对Android系统进行签名,需要生成四种类型的key文件:

  • a) releasekey
  • b) media
  • c) shared
  • d) platform

我们就拿releasekey 为例简单介绍下生成过程

使用Android源码中自带的make_key工具来生成签名,路径为development/tools/make_key

在Android系统源码根目录下,新建make_key_security目录,进入到该目录,执行下面的命令

  ../development/tools/make_key releasekey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

执行命令时都会提示输入密码,这时不要输入密码,直接按Enter健;你想想如果在编译Android系统过程中要你不断输入密码进行确认,你是不是会疯掉!!!如下就会在make_key_security目录中生成密钥对 releasekey.pk8 (私钥) / releasekey.x509.pem (公钥)

Jack:~/aosp/make_key_security$ ../development/tools/make_key releasekey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
Enter password for 'releasekey' (blank for none; password will be visible):
creating releasekey.pk8 with no password
Generating RSA private key, 2048 bit long modulus (2 primes)
....................................................................................................+++++
....+++++
e is 65537 (0x010001)
Can't load /home/ecarx/.rnd into RNG
139895179936192:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/ecarx/.rndJack:~/aosp/make_key_security$ ls
releasekey.pk8  releasekey.x509.pem

同样步骤将命令中的releasekey换成 media/shared/platform,然后执行,生成的所有秘钥对如下:

Jack:~/aosp/make_key_security$ ls -l
总用量 40
-rw------- 1 ecarx ecarx 1217 8月  14 23:45 media.pk8
-rw-rw-r-- 1 ecarx ecarx 1464 8月  14 23:45 media.x509.pem
-rw------- 1 ecarx ecarx 1218 8月  14 23:44 platform.pk8
-rw-rw-r-- 1 ecarx ecarx 1464 8月  14 23:44 platform.x509.pem
-rw------- 1 ecarx ecarx 1218 8月  14 23:30 releasekey.pk8
-rw-rw-r-- 1 ecarx ecarx 1464 8月  14 23:30 releasekey.x509.pem
-rw------- 1 ecarx ecarx 1217 8月  14 23:45 shared.pk8
-rw-rw-r-- 1 ecarx ecarx 1464 8月  14 23:45 shared.x509.pem

2)介绍一下make_key的参数

../development/tools/make_key releasekey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

这里要顺便介绍下make_key的参数。第一个参数是要生成key的名字,第二个参数是关于你公司的信息。key的名字很好理解,就是前面提到的4中类型的key,公司信息的参数比较多,它们的含义如下:

Key Description Example
C What is the two-letter country code for this unit? US
ST What is the name of your State or Province? California
L What is the name of your City or Locality? Mountain View
O What is the name of your organization? Android
OU What is the name of your organizational unit? Android
CN What is your first and last name? Android
emailAddress What is the email address? android@android.com

3.使用自定义签名

1) 修改 /build/core/config.mk 中定义变量:

DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey

2) 修改 /build/core/Makefile 中定义变量:

ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)
BUILD_KEYS := release-keys
else
BUILD_KEYS := dev-keys
endif

4.检查自定义签名

查看签名文件信息:

Jackchen:~/aosp/make_key_security$ keytool -printcert -file releasekey.x509.pem
所有者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
发布者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
序列号: 2c5386028cf9208120dcb735e63e6ce31e57faf7
生效时间: Sat Aug 14 23:30:08 CST 2021, 失效时间: Wed Dec 30 23:30:08 CST 2048
证书指纹:SHA1: 6A:72:69:63:9D:07:13:09:35:9C:22:31:6C:A1:C8:74:CF:FE:F1:8BSHA256: 45:AF:80:A8:10:AD:80:C2:71:C9:97:8A:D6:CC:FA:D0:AB:69:BA:B3:CE:80:94:D5:D0:70:63:E8:71:B0:06:CE
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

build.prop中可以查看到变量:

  ro.build.tags=release-keys  

三、制作jks格式的签名文件

1.用Android Studio生成签名文件

这个网上教材很多,我引用了两位博主的文章

在Android Studio创建keystore签名文件_TinkTan的博客-CSDN博客_android studio 创建keystore

Android Studio生成keystore签名文件_安妍妍的博客-CSDN博客_android studio 生成签名文件

之前我会一直困惑为什么创建jks签名文件时要输入两套秘密(不是确认秘密哦),后来经过查阅资料和实操验证终于弄懂了,这里和大家分享以下:

你可以将jks理解为一个仓库,一个密钥仓库,其实keystore这个名字就很直观,访问这个仓库需要一个秘密; 这个仓库里面可以存放很多很多key,所以每一个key都需要有一个自己的名字alias,访问每个key都需要密码aliaspasswd,下面通过示意图说明:

 2.从系统签名文件转化而来

1)获取android平台key
   取源码目录build\target\product\security下platform.pk8 platform.x509.pem放到一个目录中

2)生成platform.pem 
   openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem

3)生成pkcs12
   openssl pkcs12 -export -in  platform.x509.pem -inkey platform.pem -out platform.p12  -password pass:<key_pwd> -name <key_alias>

<key_pwd>  签名key的密码,下一步需要用到(对应pkcs12的密码)
<key_alias> 签名key的别名,下一步需要用到

4)生成debug.jks
   keytool -importkeystore -deststorepass <store_pwd> -destkeystore <store_name> -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass <key_pwd> -alias <key_alias>

<store_pwd>         签名文件(jks/keystore)的密码;
<store_name>      签名文件(jks/keystore)名称;
<key_pwd>            签名key的密码;
<key_alias>           签名key的别名;

以上步骤就生成了platform.jks就直接可以用于Android Studio签名了,用到的命令如下:

openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
openssl pkcs12 -export -in  platform.x509.pem -inkey platform.pem -out platform.p12  -password pass:key_password -name key_alias
keytool -importkeystore -deststorepass store_name -destkeystore debug.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass key_password -alias key_alias

另外还将以上这些命令写成了一个脚本,只要将platform.pk8 platform.x509.pem放到对应目录下,然后运行脚本,输入对应参数即可,下载连接

四、制作keystore格式的签名文件

1.从系统签名文件转化而来

和制作jks的步骤相同

如果要查看生成的签名文件里面的签名信息,可以参考我的另外一篇博客

Android签名 (一) 查看签名信息

Android签名 (二) 制作签名文件相关推荐

  1. Android签名 (三) 应用签名实操

    你可能想知道 通过这篇博客可以解决哪些问题以及学到什么: 1.应用为什么要签名,应用签名有哪些好处? 2.如何对应用进行签名? 这篇博客介绍了为什么要对应用进行签名以及如何给应用签名. 目录 一.应用 ...

  2. 【Android签名机制详解】二:Android V1、V2、V3、V4签名方案

    前言 书接上回[Android签名机制详解]一:密码学入门,在了解了消息摘要.非对称加密.数字签名.数字证书的基本概念后,我们趁热打铁.直奔主题,讲解签名在Android中的实际应用. 基础知识 An ...

  3. android cpp做成so库,Android增量更新(二)—制作合成文件so库

    ###前言 在上节中,我们已经学习了`Android增量更新`的实现原理,那么在Android开发的移动端,我们需要涉及到的其实是`文件合成`的这个流程. 那么,今天就来讲讲增量更新合成流程的实现吧. ...

  4. Android签名与认证详细分析之二(CERT.RSA剖析)

    一.Android证书的格式 Android签名中证书的格式采用X.509标准的版本三,不过省略了一些内容. X.509证书格式如下图所示: 二.证书的格式示例 从Chrome浏览器中导出一个证书,打 ...

  5. android签名的应用-- 禁止未经授权签名的apk安装

    点击打开链接 最近项目有需求: 只有使用特定签名签的apk才可以安装,其他任何apk都不能安装(root版,使用adb push进去的除外).n多度娘.google之后最终实现,把实现代码罗列一下,以 ...

  6. android digest 认证,探究 Android 签名机制和原理

    背景 最近在调研一个测试工具的使用,在使用中发现被测试工具处理过的apk文件经安装后打开就会崩溃,分析崩溃日志后原因是签名不一致导致的. 说到Android中的签名,可能大家都知道签名的目的就是为了保 ...

  7. Android签名机制---签名过程

    大神文章:http://blog.csdn.net/jiangwei0910410003/article/details/50402000 一.知识点 1.数据摘要(数据指纹).签名文件,证书文件 2 ...

  8. Android签名打包详解

    一.      Android签名有什么作用? 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序.如果你采用 ...

  9. Android签名与校验过程详解

    原文:https://blog.csdn.net/gulinxieying/article/details/78677487 目 录 一.签名与校验原理概要    2 1.数字签名简介    2 2. ...

  10. android签名方法,Android : apk系统签名的多种方法

    方法一:使用自己的Android签名工具给apk重新签名: (1)该目录下有 media.pk8.media.x509.pem.platform.pk8.platform.x509.pem.share ...

最新文章

  1. android运动轨迹rungps_android运动轨迹rungps_Android使用百度地图API实现GPS步行轨迹...
  2. 福利 | 从生物学到神经元:人工神经网络 ( ANN ) 简介
  3. InfoPath 揭秘 (一)
  4. 修改wamp的apache默认端口80为8088以及www目录
  5. 我的中年危机来得很自然
  6. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...
  7. 手写jwt框架SSO
  8. makefile如何减小可执行文件的大小(没有用到的函数不参与链接)
  9. cass坡度土方计算案例_60度斜坡怎么计算_南方CASS土方计算方法—方格网法
  10. 程序员除了转行做管理,还可以做什么?
  11. 1062. 最简分数(20)-PAT乙级真题
  12. 《Unity 4 3D开发实战详解》一6.3 粒子系统
  13. 关于typedef的使用
  14. 【Vue.js】iconfont中unicode引用和unicode引用失败,无法显示icon
  15. Can‘t update has no tracked branch
  16. 城市停车难,如何破局?
  17. 考研词汇 用语言记忆
  18. PPT制作技巧汇总之图形对象与多媒体应用(office 2007)
  19. 好书推荐:《黑客秘笈:渗透测试实用指南》
  20. FDC2214调试笔记(1)——为什么FDC2214输出的会是0x00000000或者0xffffffff?

热门文章

  1. MapGIS6.7环境设置
  2. 从微软和思科的 IT 服务化转型过程中得到的几点思考
  3. 【UWB定位】 - DWM1000模块调试简单心得 - 1
  4. python 自动批量打开网页
  5. ArrayList LinkedList
  6. i5 9400f和i7 7700k哪个好
  7. 基于Matlab的车型识别(GUI界面)
  8. 基于matlab的中值滤波算法浅析
  9. 【原创】不如预想的精彩—读《别闹了,费曼先生》
  10. android 系统GPS模块