前 言
因工作需要涉及到此内容,发现网上对这块内容很少有人更新跟进了,再加上因Java的更新,有的老旧方法报error了,同时也为了给自己留下学习笔记,特编写此教程文章
为了查找error原因我真的是煞费苦心,各种系统各种环境各种jdk版本32bit/64bit用虚拟机一个一个测试出来的,绝对实战经验!!!!!!!
环 境
System:
win7/8/8.1/10以及同内核版本的winser
Java Version:
jdk-9.0.4_windows-x64
准备工作
coffee tea or me
………………..(划船不用桨,全靠浪)
start
1.首先生成根签名(自签名)的密码库(Keystore)
用法如下
keytool -genkey -alias "别名" -keypass 别名密码 -keystore "密码库名.keystore" -storepass 密码库密码 -keyalg 加密算法 -sigalg 散列算法 -keysize 密钥长度 -validity 有效期(天) -dname "CN=名字与姓氏, OU=组织(下属)单位名称, O=组织名称, C=两位国家代码" -v
详解:
其实这些命令基本上google翻译一下也能大概懂什么意思
-genkey:计算生成密码库
-alias:别名(其实这个控制的是密码库中创建的项目名(证书名),既然大家都喊他别名也就叫他别名了,关键是直译也是别名我也是迷醉,与keystore文件是隶属关系),其中引号可加可不加,加引号是为了体现一个更为完整的名字,比如说我要取名为”XXX Root CA”这个时候如果不加引号,程序会认为”XXX”是名字,而Root是命令而CA则又成了Root的参数,同时会报错迷(未)之(知)命令
-keypass:是alias的密码(不少于6位支持大小写字母以及数字和各种奇葩符号)
-keystore:这个是密码库名,其实取啥名就不重要了,觉得不满意可以一会按F2或右键重命名文件,没错….就是输出名(名称,后缀均不影响使用)
-storepass:密码库密码(不少于6位支持大小写字母以及数字和各种奇葩符号)
-keyalg:这个要讲一下(敲黑板),首先这个命令很多教程里并没有提及也并没有加入,因为不同的需求所以需要的加密算法也不一样,可选DSA(default) or RSA
-sigalg:散列算法,同上因需而异,默认为SHA256withDSA可选SHA1/256/384/512withDSA/RSA(据说SHA1已经不安全?)
-keysize:密钥长度,直接关系到加密速度和强度,一般来说默认的2048bit在量子计算机未上线的时候已经毁天灭地了,觉得咖啡还烫的人可以试试8192/10240bit的打发时间凉凉咖啡
-validity:有效期,day为单位,默认90天,来个四五十年?
-dname:这个命令上写的比较清楚了,证书的信息,如果不加这条你还得一个一个按照提示输入,不想输入进去的直接按回车还登记的unknown,用命令不写的就不显示,显得专业点,也为了自己省事,给各位一个参考:CN=XXX Global Root CA, OU=认证中心, O=XXX集团/组织/单位, C=CN(这个也还见过写86的无论怎么写反正能表明你是哪个国家的就好)
-v:显示详细信息,不加这个除非报错不然不打印任何信息
-storepass:这个参数我在命令中并没有加入,原因是这个参数指定密码库的密码,根据提示自己输入就好,我不太喜欢密码明文输入
随后你将会得到一个”-keystore”参数指定的文件,内容为包含alias参数命名的密钥对的密码库,可以使用
keytool -list -v -keystore 项目名.keystore( -storepass 签名密码)
命令查看详细信息,括号内内容可以不加然后自己输入密码,不加的原因就在上上行
此证书是自签名的,用来做根证书(就是自己认证自己,可以理解为,我证明我自己是个大好人!!!)
2.生成App/Web待签名的keystore
再按照上面的命令生成一个自签名证书,接下来逻辑性比较强,我会使用人称方式以及代指方法给大家解释,名字不代表任何含义,如有雷同纯属巧合,如有侵权你打我呀!!!
好的,我们现在已经创建好了一个名为阿衰的app的自签名证书,但是阿衰毕竟是一款新上市的app,很多人也不认识他,所以根本不信任他的证书,阿衰为了证明自己是个好人,就带着钱找到了一家认证机构”狗蛋认证中心”(刚刚第一步生成的Root CA),狗蛋认证中心的工作人员看着阿衰手里的钱,留着哈喇子热情接待了阿衰,然后说想让我们认证你那嘎达也行,你先提交一份请示件吧,我们盖章,随后,阿衰就使用自己的自签名证书生成了一份请示件:
keytool -certreq -keystore "阿衰.keystore" -alias "阿衰app" -file 请示件.csr -v
3.前往认证中心签名
请示件写好了以后现在交给狗蛋认证中心,狗蛋经过审核后,同意给阿衰正名:我们狗蛋认证中心认证阿衰是好人!!!并且给你颁发授权证书
keytool -gencert -keystore "狗蛋认证中心(即Root CA).keystore" -alias "狗蛋环球根证书" -validity 3650 -infile 请示件.csr -outfile 盖完章的请示件.cer -v keytool -export -keystore "狗蛋认证中心(即Root CA).keystore" -alias "狗蛋环球根证书" -file 狗蛋环球根证书.crt -storepass 狗蛋环球根证书密码库密码
需要说明的是:
-gencert:理解为签署
-validity:认证有效期,例如:我认为他是好人,每十年审核一次
现在阿衰拿到了狗蛋盖完章的请示件,同时拿着狗蛋的授权证书(一会会讲为啥要那一份狗蛋认证中心的自签名证书文件(非keystore)),现在可以将自己的签完字盖完章的呈批件录入系统了,
使用命令:
keytool -importcert -keystore 阿衰.keystore -alias 狗蛋环球根证书 -file 狗蛋证书文件.cer -v keytool -importcert -keystore 阿衰.keystore -alias 阿衰app -file 盖完章的请示件.cer -v
大家会问,诶?不对啊,为啥还要把狗蛋的自签名证书导入进去呢?
这也是我无数次导入不进去却不知道哪里做错了的原因
因为系统看到你的请示件后:我去?你说狗蛋认证中心给你认证了,我还说毛蛋验证中心给我验证了呢,我要核验一下,你有什么凭证说确实有这家狗蛋认证中心呢?
这时候你就要先导入狗蛋的授权证书(自签发证书的导出文件,其实是一份公钥),让系统知道你说的狗蛋认证中心是谁,然后你作为狗蛋认证中心的被认证机构,才能导入并匹配你的私钥变成一组认证过的密钥对
4.开展业务
这时候阿衰终于圆满完成认证,可以开展业务了,阿衰现在要对自己的App或者Web进行签名,这是我们公司的app,并且我们是经过认证的,你们可以信赖我的证书,同时,如果谁修改了我的app或者冒充我的web站点,他会破坏签名或者与我的证书指纹不一致,以此保护我的app不被篡改或者我的web不被仿冒不被劫持
根据需求使用认证过的keystore改变制式或形式,对app签名保护或对web使用ssl加密通讯
>>>此处以给apk签名举例<<<
(1)将微软认为通用的pkcs12格式转换为Java的jks格式
keytool -importkeystore -srckeystore "阿衰.keystore" -srcstoretype PKCS12 -deststoretype JKS -destkeystore "jks格式的阿衰密码库.jks"
解释:
-importkeystore:可以理解为将密码库导入到一个新文件
-srckeystore:使用的密码库
-srcstoretype:使用的密码库制式
-deststoretype:导入到新文件使用的制式
-destkeystore:导入到的新文件输出名(名称,后缀均不影响使用)
(2)对apk(jar)签名思密达
jarsigner -verbose -keystore jks格式的阿衰密码库.jks -storepass 密码库密码 -signedjar 签名后的apk输出名.apk -digestalg SHA1 -sigalg SHA512withRSA -sigFile CERT 待签名.apk 别名
解释:
-verbose:显示输出动作
-digestalg:消息摘要算法,具体为啥SHA1和能不能改,没试过,根据掐指一算你命里缺我…..啥?我在说啥?
-sigalg:这里不是解释意思,根据测试这个参数不影响签名是否成功与是否被Android接受
-sigFile:这个是指定签名文件的名字,我见所有apk的签名都是用的CERT所以我就指定他为CERT了,具体影不影响不清楚,据说影响,如果不指定他好像有个默认名字,长得更丑…….
这里注意啦!!!敲黑板!!!
后面这个apk是你待签名的apk文件,要和签名后的apk输出那个signedjar参数区分开!!!
这里更要注意啦!!!再敲黑板!!!
最后这个别名,指的是alias!!!这里因为我们用的是认证的证书,所以里面有两个alias,那么因为RSA签名机制是采用私钥签名的,而我们只有刚才提到的”阿衰app”才是一个完整的密钥对(公钥私钥),那个”狗蛋认证中心”给我们提供的只是他的公钥(就是刚才说的”授权证书”),所以不能用来签名
我再再敲黑板!!!是不是签名报错了!!!内心是不是崩溃的,哥们你反编译的需要把META-INF文件夹删除再签名
我特么还想敲黑板!!!是不是没报错!!!但是是不是安卓不认!!!华为解析包失败,三星安装失败,反正各种失败有木有(华为部分机型可以安装,蜜汁尴尬)
哇哈哈哈哈哈哈哈哈哈哈
这是全网唯一的答案,好多人步骤啥的全都做对了,各种方法都实验过了,就是签名成功安装失败,
是因为签名必须要用Jdk6安卓才认包,没错,jdk6,亲测8也不好使
我各种环境各种情况一个一个试出来的,最终在虚拟机XP环境安装Jdk6签名安卓可以安装使用,为了找这个问题我连着两天每天测试19个小时只睡4个小时研究这个问题,当时感觉就是,生无可恋啊哇哈哈哈哈
发表回复