沫延说
沫延说
Java9环境下使用keytool工具从生成Root CA根证书到给App、Web签发证书
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签发证书

及时获取更多文章,欢迎关注“Topstalk”微信订阅号

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

Get more articles in time,Welcome to follow the "Topstalk" WeChat subscription account

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

Morton.L

文章作者

发表评论

textsms
account_circle
email

沫延说

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