需求来源
第三方人员需要对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学习,欢迎互相探讨。