① 如何为apk以及zip文件签名
如果你只是想知道如何签名及下载签名工具,请直接看“如何使用SignApk.jar来为一个apk或zip文件签名”部分。要创建自己的证书请从头看起。
准备知识:
当你要发布一个软件或是自制的ROM时,你就需要一个使用了私钥的证书来为.apk或.zip文件进行签名。android系统使用证书来识别软件作者和软件之间所建立的认证关系。做这个事情最经典的方式就是用keytool创建证书,然后使用jarsigner进行签名。但是本教程则会提供一个对于大多数人来说更为容易的方法,那就是使用一个名为SignApk.jar的工具。
SignApk.jar是一个已包含在Android平台源码包中的工具,你可以在本贴的附件中下载。如果要使用SignApk.jar,你需要创建一个带有对应证书/公钥的私钥。而你可以使用Openssl来创建私钥/公钥对。在Unix/Linux系统中使用Openssl相对来说比较容易。对于Windows用户,你可以在本贴附件或此链接中下载Windows版本的Openssl。
如何使用OpenSSL创建私钥/公钥对(也就通常说的证书文件,有误勿怪)(Windows版本)
下载附件中的openssl-0.9.8k_WIN32.zip
将下载到的压缩包解压到你电脑上的任意位置(例如:C:\OpenSSL)
在OpenSSL\bin文件夹下按顺序输入(使用CMD命令行工具,其中第2步会需要你输入一些信息,见图):
1、openssl genrsa -out key.pem 1024
2、openssl req -new -key key.pem -config C:\OpenSSL\openssl.cnf -out request.pem
3、openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
4、openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
大星星提示:如果你的recovery不具备签名校验切换功能,那么用你自己生成的证书文件来给ROM签名,会提示签名校验失败。因为目前几乎所有的第三方recovery中所带的私钥都是testkey的。(附件中的android.zip里面所包含的证书文件已更新为testkey)
如何使用SignApk.jar来为一个apk或zip文件签名:
下载附件中的android.zip
将下载到的压缩包解压到你电脑上的任意位置(例如:C:\android)
如果你的电脑上还没有安装java环境,请下载并进行安装。
(如果你创建了自己的私钥/公钥对)复制certificate.pem和key.pk8到你解压得到的android文件夹中
使用CMD命令行工具cd到android文件夹,然后输入:(对于我提供的包,只需要将要签名的文件放在android文件夹中,然后拖至对应的批处理文件上即可)
java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk
或是
java -jar signapk.jar certificate.pem key.pk8 your-update.zip your-signed-update.zip
② 用命令给apk签名
给apk签名。
用已有的jks文件带贺给apk签名。
先打开jdk文件夹,例如E:\Program Files\Java\jdk1.8.0_201\bin。
然后打开cmd输入以下命令
其中alias就是当初创建签名文件时所设定的,碰尘不能笑行禅随便写。
在签名之前应当删除apk中META-INF中的文件,以免签名冲突。
2021年8月4日
③ 怎么给Android应用程序签名
不管是模拟器还是真实手机。因此,在设备或者是模拟器上运行调试程序之前,必须为应用程序设置数字签名。 所有的程序都必须签名,没有被签名的程序,系统将不能安装。 可使用自签署证书签署应用程序,无须授权凭证。系统仅仅会在安装的时候测试签名证书的有效期,如果应用程序的签名是在安装之后才到期,那么应用程序仍然可以正常启用。可以使用标准工具-Keytool and Jarsigner-生成密钥,来签名应用程序的.apk文件。 Android SDK 工具可以在调试时给应用程序签名。ADT插件和Ant编译工具都提供了两种签名模式-debug模式和release模式 debug模式下,编译工具使用JDK中的通用程序Keytool通过已知方法和密码创建秘锁和密钥。每次编译的时候,工具使用debug密钥签名应用程序的.apk文件。因为密码是已知的,工具 不需要在每次编译的时候提示输入密锁和密钥。 当应用程序调试完毕准备要发布release版本时,可以在release模式下编译。release模式下,编译工具不会将.apk文件签名。尺梁需要自己用Keytool生成密钥和密锁,再用JDK中的Jarsigner工具给.apk文件签名。签名基本设置 首先设置JAVA_HOME环境变量,告诉SDK如何找到Keytool,或者可以在Windows 系统环境变量PATH变量中添加Keytool的JDK路径。 在发布release版本时,从Package面版上按选中你的project,按鼠标右键,依次选择Android Tools、Export Application Package。或者可以点击Manifest Editor,overview 页面上的“Exporting the unsigned .apk”连接 ,导出未签名apk文件。保存.apk文件后,用Jarsigner及自己的旁握密钥给apk文件签名,如果没有密陵启运钥, 可以用Keystore创建密钥和密锁。如果已经有一个密钥了,如公共密钥,就可以给.apk文件签名了。 也可以把上面这个完整的步骤写成一个bat文件,这样需要签名的时候只要运行这个bat就可以了。下面给出一个完整的bat文件示例: @Rem android签名程序 //注释指令 @Rem echo是显示指令 格式:echo [{on|off}] [message] @echo ********************************************************** @Rem 文件是否存在命令格式:if exist 路径+文件名 命令 @if exist d:sign/MyFirstApp.keystore goto sign @echo 创建签名文件MyFirstApp.keystore @Rem keytool命令格式:-genkey产生签名 -alias别名 -keyalg加密算法 -validity有效天数 -keystore生产签名文件名称keytool -genkey -alias MyFirstApp.keystore -keyalg RSA -validity 40000 -keystore MyFirstApp.keystore @echo 开始签名: @Rem jarsigner命令格式:-verbose输出详细信息 -keystore密钥库位置 -signedjar要生成的文件 要签名的文件 密钥库文件 jarsigner -verbose -keystore MyFirstApp.keystore -signedjar MyFirstApp_signed.apk MyFirstApp.apk MyFirstApp.keystore @goto over :sign @echo 开始签名:jarsigner -verbose -keystore MyFirstApp.keystore -signedjar MyFirstApp_signed.apk MyFirstApp.apk MyFirstApp.keystore :over @echo ********************MyFirstApp.apk 签名完成*********************** pause 以上是一个给应用签名的完整bat文件,在运行这个bat文件时,还需要按照屏幕提示的步骤输入一些必要信息,最后生成一个签名后的文件是:MyFirstApp_signed.apk。
④ APK签名机制原理详解
众所周知,Android系统在安装Apk的过程中,会对Apk进行签名校验,校验通过后才能安装成功。那你知道签名校验的机制是什么?具体校验的是什么内容吗?申请第三方SDK(如微信支付)时填入的SAH1值是什绝颂高么?目前众多的快速批量打包方案又是如何绕过签名检验的?
我将通过一系列的文章来解开这些疑惑:
这篇文章先来介绍Apk签名相关的基本知识。
要知道签名是什么,先来看为什么需要签名 。大家都知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。在安装Apk时,同样需要确保Apk来源的真实性,以及Apk没有被第三方篡改。如何解决这两个问题呢?方法就是开发者对Apk进行签名:在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。
要了解如何实现签名,需要了解两个基本概念:数字摘要和数字证书。
简单来说,就是对一个任意长度的数据,通过一个Hash算法计算后,都可以得到一个固定长度的二进制数据,这个数据就称为“摘要”。摘要具有下面的几个特征:
前面已经说到,可以通过签名来确保数据来源的可靠性和数据的不可篡改性。签名就是在摘要的基础上再进行一次加密,对摘要加密后的数据就可以当作数字签名,在安装Apk需要对签名进行验证,验证通过才能继续安装。
这里有两个过程:签名过程 和 校验过程。
先来说 签名过程:
再来看 校验过程:
这里有一个前提:接收方必须要知道发送方的公钥和所使用的算法。如果数字签名和公钥一起被篡改,接收方无法得知,还是会校验通过。如何保证公钥的可靠性呢?答案是数字证书,数字证书是身份认证机构(Certificate Authority)颁发的,包含了以下信息:
接收方收到消息后,先向CA验证证书的合法性(根据证书的签名、绑定的域名等信息。CA机构是权威的,可以保证这个过程的可靠性。)再进行签名校验。
需要注意的是,Apk的证书通常的自签名的,也就是由开发者自己制作,没有向CA机构申请。Android在安装Apk时并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,这也正是对第三方Apk重新签名后,还能够继续在没有安装这个Apk的系统中继续安装的原因。
我们在对Apk签名时并没有直接指定私钥、公钥和数字证书,而是使用keystore文件,这些信息都包含在了keystore文件中。根据编码不同,keystore文件分为很多种,Android使用的是Java标准keystore格式JKS(Java Key Storage),所以通过Android Studio导出的keystore文件是以.jks结尾的。
keystore使用的证书标准是X.509,X.509标准也有多种编码格式,常用的有两种:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。jks使用的是der格式,Android也支持直接使用pem格式的证书进行签名,我们下面会介绍。
两种证书编码格式的区别:
X.509证书格式:
Android提供了两种对Apk的签名方式,一种是基于JAR的签名方式,另一种是基于Apk的签名方式,它们的主要区别在于使用的签名文件不一样:jarsigner使用keystore文件进行签名;apksigner除了并尺支持使用keystore文件进行签名外,还支持直接指定pem证书文件和私钥进行签名。
不知道大家有没有注意一个问题,我们通过樱御keytool或者AS生成一个keystore的时候( 签署您的应用 ),除了要输入keystore的密码外,还要输入一个alias和key的密码。在签名时,除了要指定keystore文件和密码外,也要指定alias和key的密码,这是为什么呢?
原因是keystore是一个密钥库,也就是说它可以存储多对密钥和证书,keystore的密码是用于保护keystore本身的,一对密钥和证书是通过alias来区分的。从这里可以看出jarsigner是支持使用多个证书对Apk进行签名的。apksigner也同样支持,关于apksigner的使用介绍可以参考官方文档 apksigner 。
ok,签名的基本概念和校验过程就介绍到这里,关于JAR签名和V2签名机制的详细介绍,参考下面两篇文章:
⑤ 如何对Android的APP进行签名
签名方法:
1.使用Keytool 和jarsigner工具签名(在jdk/bin目录下)
1.生成签名keystore:
确保电脑上安装了JDK,因为我们将使用JDK自带的创建和管理数字证书的工具Keytool。在命令行下输入如下命令:
keytool -genkey -v -keystore app.keystore -alias alias_name -keyalg RSA -validity 20000
-alias 后面跟的是别名这里是alias_name
-keyalg 是加密方式这里是RSA
-validity 是有效期这里是20000
-keystore 就是要生成的keystore的名称这里是app.keystore
然后按回车键
按回车后首先会提示你输入的密码:这个在签腔誉名时要用的,要记住
然后会再确认你的密码。
之后会依次叫你输入姓名、组织单位、组织名称、城市区域、省份名称、国家代码(CN)等。
Keytool的详细参数请参考:
http://www.android123.com.cn/androidkaifa/173.html
2.签名:
jarsigner -verbose -keystore app.keystore -signedjar app_signed.apk app.apk alias_name
-keystore: keystore的名称
-signedjar app_signed.apk: 指定签名后生成的APK名称
app.apk: 目标APK
然后按回车:会要氏帆求输入刚才设置的密码,输入后按回车就开始签名了。
3.查看签名:
jarsigner -verify app_signed.apk
查看是否签名,如果已经签名会打印 "jar verified".
jarsigner -verify -verbose -certs app_signed.apk
查看签名详细信息。
4.通过zipalign工具进行优化apk(android自带的工具,./build/tools/zipalign)
zipalign -v 4 app_signed.apk androidres.apk 对apk优化
zipalign -c -v 4 androidres.apk 查看apk是否经过优化
2.使用eclipse ADT工具签名
在Package Explorer 窗口,右键,选择Android Tools--->Export Signed Application Package 然后按照提示一步一步,生成已签名的apk。通过eclipse也可以导出未签名的APK文件。
注:需要输入两次密码,第一次是私钥密码,第二次时私钥别名的伍核段密码。
3.eclipse在debug模式下自动签名(无须手动配置):
在debug模式下用eclipse 的ADT为android签名,只要应用程序在eclipse下开发,系统就会自动给apk签名和优化。
在Eclipse中Windows > Preferences > Android > Build可以看到你keysotre的位置
⑥ 如何对apk进行签名
给apk文件签名主要分三步:
1、创建证书
2、签名
3、优丛橡化(可选)
1)使用jdk的keytool工具生成签名用的证书> keytool -genkey -v -alias CERT -keyalg RSA -keysize 2048 -validity 10000 -keystoreCERT.keystore 创建过程需要输入一些标识信息和密码,一些重要的参数值说明如下(根据自己的需要要进行相应的修改): CERT.keystore ---- 证书保存的文件名 CERT ---- 证书的别名 10000 ---- 10000天的有效期 2048 ---- 默认为1024 bits,Android 建议使用2048 bits或更高其他的详细信息可以使用keytool -help查看帮助 证书生成后使用仿梁如下命令可以查看证书的信息:> keytool -list -alias CERT -keystore CERT.keystore
2)使用jdk的jarsigner工具对apk文件签名> jarsigner -verbose -keystore CERT.keystore to_sign.apk CERT 签名过程需要输入证书的密码,一些重要的参数值说明如下(根据自己的需要要进行相应的修改): CERT.keystore ---- 证书保存的文件名 CERT ---- 证书的别名 待签名的apk文件根根目录下如果有文件夹“META-INFO”,请先删除(重新签名就需要这样做)备郑运。如果不想创建过程输出太多信息,可以删除“-verbose” 。上述签名会直接覆盖原来的文件,如果不想被覆盖而签名为另外的新文件 signed.akp,只需将 to_sign.apk 改为 -signedjar to_sign.apk signed.akp 即可。签名后可以使用如下命令验证是否签名成功: > jarsigner -verify to_sign.apk 如果需要查看更详细的验证信息,可修改为:> jarsigner -certs -verbose -verify to_sign.apk
3)使用android sdk的zipalign工具优化已签名的apk文件> zipalign -v 4 unaligned.apk aligned.apk 注意要在签名后再zipalign。这个工具不是jdk自带的,而是在%ANDROID_HOME%\tools\zipalign.exe。
⑦ 如何让应用程序获得系统权限以及如何使用platform密钥给apk签名
Android中许多函数只能是系统程序或者有root权限的程序才可以调用,否则会有"Permission denied"异常。所以如果开发时要调用此类函数,必须授予程序root权限。下面是两种具体的实现方法
注:两种方法都不一定适用于所有android系统。
方法一:需要在清掘Android系统源码的环境下用make来编译:
在应用程序的 AndroidManifest.xml 中的 manifest 节点中加入 android:sharedUserId="android.uid.system" 这个属性
修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
使用mm命令来编译,生成的apk就有修改系统时间的权限了。
方法二:
同上,加入android:sharedUserId="android.uid.system"这个属性。
使用eclipse编译出apk文件,但是这个apk文件是不能用的。
用压缩软并漏件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。 (这一步我跳过了(原本是无意的,后来发现下面也有提到),结果一样可以)
使
用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在Android源码目录中的位置
是"build\target\proct\security",下面的platform.pk8和platform.x509.pem两个文件。然
后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk
platform.x509.pem platform.pk8 input.apk
output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
<此时这样最后得到的apk和第一个方法是一样的>
解释一下原理,首先加入
android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User
id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就
有权限来调用那些需要系统权限的函数了。 只是加入UID还不够,如果这时候答蔽核安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中
还要有目标系统的platform
key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系
统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。
有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到
platform.pk8
和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key
来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match
those in shared user android.uid.system",这样也是保护了系统的安全。
最后说一下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。
⑧ 对未签名的 APK 重签名
在对某个 APP 进行逆向时,最后一步将修改应用到 APK 中往往会生成未签名的 APK,而 Android 要求每个 APK 都必须要有签名才能被安装,因此我们需要对未签名的 APK 进行签名
在 keytool 所在的文件夹下(通常是 C:\Program Files\Java\jdk1.8.0_101\bin 之类的)以管理员身份执行如下命令
-keystore reverse_engineer.keystore 表示生成的数字证书的文件名为 "reverse_engineer.keystore";
-alias rekeystore 表示证书的别名为 "rekeystore",可以与 keystore 一样;
-keyalg RSA 表示生成密钥文件所采用的算法为 RSA;
-validity 10000 表示该数字证书的有效期为10000天,意味着10000天之后该证书将失效;
然后根据提示输入密钥、地区等信息。最终,这条命令将生成名为 reverse_engineer.keystore 的数字证书
将数字证书拷贝到需要签名的 apk 的目录下,在 jarsigner 所在的文件夹下(通常是 C:\Program Files\Java\jdk1.8.0_101\bin 之类的)以管理员身份执行如下命令执行如下命令
-keystore 表示使用当前目录中的 reverse_engineer.keystore 签名证书文件;
-storepass 密钥口令;
-signedjar crackme02_release.apk表示签名后生成的APK名称;
crackme02.apk 表示未签名的APK;
rekeystore 表示 reverse_engineer.keystore 的别名
如果你不是被逆向的 APP 的作者,那么你重签名时使用的私钥在绝大多数情况下不会和逆向前的 APP 相同。在 Android 的安全策略下,这样的 APP 是不能被安装的,因此需要将之前的 APP 卸载掉,才能将重新打包后的 APK 重新安装到 Android 设备上
参考文章:
Android反编译(三)之重签名
⑨ 如何对Android的APP进行签名
1.签名的步骤
a.创建key
b.使用步骤a中产生的key对apk签名
2.具体操作
方法一: 命令行下对apk签名(原理)
创建key,需要用到keytool.exe (位于jdk1.6.0_24jrein目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于jdk1.6.0_24in目录下),把上两个软件所在的目录添加到环境变量path后,打开cmd输入
D:>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
/*说明:-genkey 产生密钥
-alias demo.keystore 别名 demo.keystore
-keyalg RSA 使用RSA算法对签名加密
-validity 40000 有效期限4000天
-keystore demo.keystore */
D:>jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore
/*说明:-verbose 输出签名的详细信息
-keystore demo.keystore 密钥库位置
-signedjar demor_signed.apk demo.apk demo.keystore 正式签名,三个参数中依次为签名后产生的文件demo_signed,要签名的文件demo.apk和密钥库demo.keystore.*/
注意事项:android工程的bin目录下的demo.apk默认是已经使用debug用户签名的,所以不能使用上述步骤对此文件再次签名。正确步骤应该是:在工程点击右键->Anroid Tools-Export Unsigned Application Package导出的apk采用上述步骤签名。
方法二:使用Eclipse导出带签名的apk
Eclipse直接能导出带签名的最终apk,非常方便,推荐使用,步骤如下:
第一步:导出。
第二步:创建密钥库keystore,输入密钥库导出位置和密码,记住密码,下次Use existing keystore会用到。
第三步:填写密钥库信息,填写一些apk文件的密码,使用期限和组织单位的信息。
第四步:生成带签名的apk文件,到此就结束了。
第五步:如果下次发布版本的时候,使用前面生成的keystore再签名。
第六步:Next,Next,结束!
方法三:使用IntelliJ IDEA导出带签名的apk
方法步骤基本和Eclipse相同,大概操作路径是:菜单Tools->Andrdoid->Export signed apk。
⑩ 手机怎么给APK签名
经常在手机端修改Android软件的同学肯定知道,在APK被修改之后就需要重新来签名,否则是念桐无法正常安装的。既然是手机党,自然接触电脑的机会就少了很多,小编也不去教大家如何在电脑上给APK签名了,咱们就说说如何用天天握在手上的手机怎么签名APK文件吧。
这里需要用到手机端签名的工具ZipSigner,这个工具不仅可给APK签名,还支持zip及jar格式。自己修改过ROM包后也可用它来进行签名。大伙先纳高历在手机上安装好。
去除APK原签名文件
我们把修改完成的APK在电脑上用解压缩软件打开,打开到META-INF文件夹,把里面的几个签名文件都删除,这个步骤是为洞搜了提高签名的成功率,通常不做也可以。
APK签名
ZipSigner安装后打开界面如图,默认的签名文件为SD卡上的unsigned.zip,可以把需要签名的APK改成这个名字,放到SD卡根目录,进行签名,签名后把signed.zip后缀名改成APK就可以了。也可以不用改名,把需要签名的APK文件放到SD卡根目录,然后点“选择输入/输出文件”,找到要签名的APK,程序里的ZipSigner输入/输出文件名也自动会相应更改了。文件选择好后点“签名选择文件”很快签名就完成了。
签名后安装
我们验证下签名后的APK程序是否能正常安装,用文件管理器在SD卡找到刚签名生成的APK,进行安装,果然可以正常安装了,好了,可以收工了。
签名其实就是一个很简单的过程,只不过我们可以用程序把他简单化。当然大家记住一个原则,无论是修改了APK的什么元素,只要是APK的结构产生了变化,就一定需要重新签名才能正常使用。