沫延说
沫延说

Java9环境下使用keytool工具从生成Root CA根证书到给App、Web签发证书

前    言

因工作需要涉及到此内容,发现网上对这块内容很少有人更新跟进了,再加上因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个小时研究这个问题,当时感觉就是,生无可恋啊哇哈哈哈哈

 

 

 

 

 

 

 

 

没有标签
首页      未分类      Java9环境下使用keytool工具从生成Root CA根证书到给App、Web签发证书

Morton.L

文章作者

发表回复

textsms
account_circle
email

沫延说

Java9环境下使用keytool工具从生成Root CA根证书到给App、Web签发证书
前    言 因工作需要涉及到此内容,发现网上对这块内容很少有人更新跟进了,再加上因Java的更新,有的老旧方法报error了,同时也为了给自己留下学习笔记,特编写此教程文章 为了查找error原因…
扫描二维码继续阅读
2018-02-08