Android Apk 免密签名

需求来源

第三方人员需要对apk进行重新签名(免密码)
公司运营相关人员需要对apk重新签名(免密码)
后台签名系统需要对渠道包分别签名(免密码)
签名密码各种不可逆的忘记的情况(免密码)

实验材料准备

1.keystore签名文件一枚(已知密码)
2.无签名apk文件一枚
3.keytool工具(位置一般在jdk安装目录下的bin目录下)
4.openssl工具(有下载安装的自己应该知道位置在哪,没有安装的童鞋走传送门下载一下)–openssl源码下载传送门
5.期间你还可能用到ActivePer用于编译opensslActivePer下载传送门
就如上工具准备好了,就开干吧

keystore导出pk8, x509.pem

导出原因,基于各种不需要密码也要对apk签名的需求,划重点–先期你是需要知道你的keystore的密码的。

1.使用keytool工具导出PKCS12文件

首先我们要使用的是keytool的 -importkeystore命令,二话不说,先看使用方法

keytool -importkeystore [OPTION]...

从其他密钥库导入一个或所有条目

选项:

 -srckeystore <srckeystore>            源密钥库名称
 -destkeystore <destkeystore>          目标密钥库名称
 -srcstoretype <srcstoretype>          源密钥库类型
 -deststoretype <deststoretype>        目标密钥库类型
 -srcstorepass <arg>                   源密钥库口令
 -deststorepass <arg>                  目标密钥库口令
 -srcprotected                         受保护的源密钥库口令
 -srcprovidername <srcprovidername>    源密钥库提供方名称
 -destprovidername <destprovidername>  目标密钥库提供方名称
 -srcalias <srcalias>                  源别名
 -destalias <destalias>                目标别名
 -srckeypass <arg>                     源密钥口令
 -destkeypass <arg>                    目标密钥口令
 -noprompt                             不提示
 -providerclass <providerclass>        提供方类名
 -providerarg <arg>                    提供方参数
 -providerpath <pathlist>              提供方类路径
 -v                                    详细输出

很明显,我们照其口令给它要的,那我们想拿的,指令如下:

keytool -importkeystore -srckeystore "yourJdkPath\bin\mykey.keystore" -destkeystore "yourJdkPath\bin\mykey.p12" -srcstoretype JKS -deststoretype PKCS12 -srcstorepass yourpass -deststorepass youpass

执行后,我在destkeystore指定的目录下拿到了pkcs12格式文件

2.使用openssl工具dump出pem文件

首先看一下使用方式

openssl pkcs12 -help

Usage: pkcs12 [options]
where options are
-export       output PKCS12 file
-chain        add certificate chain
-inkey file   private key if not infile
-certfile f   add all certs in f
-CApath arg   - PEM format directory of CA's
-CAfile arg   - PEM format file of CA's
-name "name"  use name as friendly name
-caname "nm"  use nm as CA friendly name (can be used more than once).
-in  infile   input filename
-out outfile  output filename
-noout        don't output anything, just verify.
-nomacver     don't verify MAC.
-nocerts      don't output certificates.
-clcerts      only output client certificates.
-cacerts      only output CA certificates.
-nokeys       don't output private keys.
-info         give info about PKCS#12 structure.
-des          encrypt private keys with DES
-des3         encrypt private keys with triple DES (default)
-idea         encrypt private keys with idea
-seed         encrypt private keys with seed
-aes128, -aes192, -aes256
              encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
              encrypt PEM output with cbc camellia
-nodes        don't encrypt private keys
-noiter       don't use encryption iteration
-nomaciter    don't use MAC iteration
-maciter      use MAC iteration
-nomac        don't generate MAC
-twopass      separate MAC, encryption passwords
-descert      encrypt PKCS#12 certificates with triple DES (default RC2-40)
-certpbe alg  specify certificate PBE algorithm (default RC2-40)
-keypbe alg   specify private key PBE algorithm (default 3DES)
-macalg alg   digest algorithm used in MAC (default SHA1)
-keyex        set MS key exchange type
-keysig       set MS key signature type
-password p   set import/export password source
-passin p     input file pass phrase source
-passout p    output file pass phrase source
-engine e     use engine e, possibly a hardware device.
-rand file;file;...
              load the file (or the files in the directory) into
              the random number generator
-CSP name     Microsoft CSP name
-LMK          Add local machine keyset attribute to private key

开始获取pem文件

openssl pkcs12 -in “Yourpath\mykey.p12” -nodes -out “Yourpath\mykey.rsa.pem”
期间输入密码,即可获得pem文件

3.获得公钥x509.pem文件

打开上一步获得的pem文件,可以看到文件内容大概如下:

Bag Attributes
    friendlyName: key30
    localKeyID: 54 69 6D 65 20 31 35 33 36 39 39 33 38 36 38 37 36 37 
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIvWwHfUWjyitUZ/
5LJxjel9C/GhdOkqKsVe2baeEsP2ZaeXrN3zM4/V/LopKjmn3SXIRKnRLLq48p+N
kszn/8gQm3Y7DtNnYQvWFJ3LiveVsHkpbDKkUijoTBsovHjHtyRnUwwFTPWMchY/
Th61esl9KdJHTxqbqvLGZUeYL9ZjAgMBAAECgYAYCEU1ktIbP59FyW8FV8yaxvnJ
ggT0mWGWX/Gsl8gD05Gu1rtHvacr3gu79p0iIX45Iwzh3mgAgw53az5CZtCnUWDL
bd+qZPNfS6R4Mllv/jNGC9UVPOxCaTRT4JQ3HfNaZeh2BcQMvi/1DLgh0/PzwsOJ
VUFWNm+vyTMM+QpKMQJBAMAbufOfr08HQYIft+UgkcWPsRsd753xCdQGcnrbzVms
C9YmWrxZnGSH5J907WZcWX+3nis/2bSajuEJGiV40MkCQQC6WMJVI0O4ZJqYmrwP
PuimqeylyyKLbOM48L2L/HOl/f73zO+DOhH8MMNNxNCSPlVKIMMmVzn/gBOv1hfx
so/LAkAk7C9NN7/F/KsGi3oYu63IvtlXUOWhAZbV/Xc7TcumFH8h5bVCxiZc3BGA
5ERMjCtXdL8dqOP65knXzpwL37ChAkASNYIn155ScmI470XZJ4iMYKZjPQpPHYDG
m5+qAi061ysHA9uTsyT2w70R6F2JLNYgvDrVkEh2kwlZcU49q/kpAkEAjl/aOGCI
pLm9SEjKcwFzV4qBL9CtFCcGp2TcDPTcp0U/QfKO6ndPyCP28S9zockzF5c9tgqS
ufuc258uk06FVw==
-----END PRIVATE KEY-----
Bag Attributes
    friendlyName: key30
    localKeyID: 54 69 6D 65 20 31 35 33 36 39 39 33 38 36 38 37 36 37 
subject=/C=(CN)/ST=(BJ)/L=(BJ)/O=(SS)/OU=(SS)/CN=(SS)
issuer=/C=(CN)/ST=(BJ)/L=(BJ)/O=(SS)/OU=(SS)/CN=(SS)
-----BEGIN CERTIFICATE-----
MIICUDCCAbmgAwIBAgIEceWnmTANBgkqhkiG9w0BAQsFADBaMQ0wCwYDVQQGEwQo
Q04pMQ0wCwYDVQQIEwQoQkopMQ0wCwYDVQQHEwQoQkopMQ0wCwYDVQQKEwQoU1Mp
MQ0wCwYDVQQLEwQoU1MpMQ0wCwYDVQQDEwQoU1MpMCAXDTE2MDcyNTA5MTcyM1oY
DzIxMTYwNzAxMDkxNzIzWjBaMQ0wCwYDVQQGEwQoQ04pMQ0wCwYDVQQIEwQoQkop
MQ0wCwYDVQQHEwQoQkopMQ0wCwYDVQQKEwQoU1MpMQ0wCwYDVQQLEwQoU1MpMQ0w
CwYDVQQDEwQoU1MpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCL1sB31Fo8
orVGf+SycY3pfQvxoXTpKirFXtm2nhLD9mWnl6zd8zOP1fy6KSo5p90lyESp0Sy6
uPKfjZLM5//IEJt2Ow7TZ2EL1hSdy4r3lbB5KWwypFIo6EwbKLx4x7ckZ1MMBUz1
jHIWP04etXrJfSnSR08am6ryxmVHmC/WYwIDAQABoyEwHzAdBgNVHQ4EFgQUk2U6
jNBhilvDaCJ5u+PSniYoDaEwDQYJKoZIhvcNAQELBQADgYEAHsp46fQ8+Dm9TnEI
RAMCaFQ+MpMyc/zjj0QUH18LNrMMt/FAhSqu0svqWBVpUypdLjHrvjLUE9yHoOW8
jphwO5YB4KR9gGTfQG2LxaSaMIPAzGrmhWhOV3Kf055KKN/qGwIYWN5VpkbI9gaB
sfDxIqX7haasLf9GFzMA3MSgt0M=
-----END CERTIFICATE-----

新建文件,命名为:mykey_public.x509.pem
将一下标签的内容包括标签,复制到新建的文件中。

-----BEGIN CERTIFICATE-----
......
-----END CERTIFICATE-----

至此,我们得到了签名所需要的公钥文件(mykey_public.x509.pem),此文件就成为我们等一下需要签名用到的公钥(证书)文件。

4.pk8私钥生成

新建一个文件mykey_private.rsa.pem,并且把mykey.rsa.pem文件中以下内容复制到本文件中

-----BEGIN PRIVATE KEY-----
......
-----END PRIVATE KEY-----

然后我们看一下openssl中的使用方式

openssl pkcs8 -help

Usage pkcs8 [options]
where options are
-in file        input file
-inform X       input format (DER or PEM)
-passin arg     input file pass phrase source
-outform X      output format (DER or PEM)
-out file       output file
-passout arg    output file pass phrase source
-topk8          output PKCS8 file
-nooct          use (nonstandard) no octet format
-embed          use (nonstandard) embedded DSA parameters format
-nsdb           use (nonstandard) DSA Netscape DB format
-noiter         use 1 as iteration count
-nocrypt        use or expect unencrypted private key
-v2 alg         use PKCS#5 v2.0 and cipher "alg"
-v1 obj         use PKCS#5 v1.5 and cipher "alg"
 -engine e       use engine e, possibly a hardware device.

根据提示,我们操作mykey_private.rsa.pem文件
openssl pkcs8 -topk8 -outform DER -in mykey_private.rsa.pem -inform PEM -out mykey_private.pk8 -nocrypt

签名实施

使用以上步骤得到的两个文件

mykey_public.x509.pem
mykey_private.pk8
我们就可以愉快的无密码签名apk了。
使用指令:

java -jar signapk.jar mykey_public.x509.pem mykey_private.pk8 unsigned.apk signed.apk

至此,安装signed.apk,运行正常。
signed.jar传送门

个人博客,原文地址 http://blog.minihu.top/index.php/android_pro/81.html

注:个人技术文章,将第一时间在个人博客发布.
技术领域:Android客户端应用开发,Android客户端Sdk开发,Android安全,Android逆向,Php学习,欢迎互相探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值