本人比较lower一直使用doc命令,生成签名文件,一直使用keystore,最近遇到一个同行用的jks,但是现在很多大平台提供的加固包也就是加壳包,都需要keystore,研究了下,实现jks文件转换为keystore文件需求。

1.了解keystore

标准keystore(standard jdk keystore types)包括:

JCEKS,JKS,PKCS12这几种格式,主要区别就是jceks可是用来存储对称密钥(分组密钥、私密密钥),而jks就只能存储非对称密钥对(私钥+x509公钥证书),pkcs12是通用格式(rsa公司标准)微软和java都支持。这里就产生了一个问题:使用java的keytool产生的keystore如何在微软的系统下使用(如何导入到ie中),解决方法就是先将jks的keystore变成pkcs12格式的keystore。其实jdk中存在一个keystore class,提供了抽象的通用对keystore操作的类,基于这个接口,实现了以下这个可是在两种格式之间互导的程序[该1解释摘自他人博客]

2.jks—>keystore本质

仔细阅读了keystore的相关,也就是jks—>keystore文件本质,就是把jks文件的加密信息导出成为PKCS12的类型文件,再把这个信息,导入到keystore文件中

3.jks—>keystore需要提供支持

1)jdk环境:更具上面的内容我们会发现,我们需要依赖jdk环境,顾需要进行一系列的操作一定要有jdk环境
2)需要提供JKS到PKCS12转换的方法
3)需要提供PKCS12内容导入||生成keystore文件的方法

4.具体实现

根据上面的分析,我们就要一步一步的进行实现上面分析的操作
1)首先JDK环境
现在很多的电脑已经不需要自己认为配置JDK环境,只需要安装JDK就会自己配置,因为本人是android开发,本身就已经有jdk环境
2)生成jks文件
小编用as生成了jks文件,“”test.jk“”

jackcess 文档 jceks文件_keystore

3)jsk转换为PKCS12类型方法
java环境中提供了相关支持,代码如下:
<1>Java代码实现
//这里是得到jks的FileInputStream
            FileInputStream jskFile = new FileInputStream(stroe1FileName);  
            //创建jks KeyStore对象
            KeyStore keyStore1 = KeyStore.getInstance("JKS");  
            keyStore1.load (jskFile, store1Passwd.toCharArray());  
            Key key = keyStore1.getKey(store1KeyAlias ,store1KeyPasswd.toCharArray());  
            KeyFactory keyfact = java.security.KeyFactory.getInstance(key.getAlgorithm());  
            PrivateKey priKey = keyfact.generatePrivate(new PKCS8EncodedKeySpec(key.getEncoded()));  
            KeyStore keystore2 = KeyStore.getInstance("PKCS12");  
            //这里没有设置密码,当你写入keystore文件的时候会提示设置密码
            keystore2.load(null, null); 
            //把jks的信息写入到PKCS12对象中
            keystore2.setKeyEntry(store2KeyAlias, priKey, store2KeyPasswd.toCharArray(),keyStore1.getCertificateChain(store1CertChainAlias));  
            keystore2.store(new FileOutputStream(store2FileName), store2Passwd.toCharArray());
<2>doc命令
keytool -importkeystore -srckeystore D:\test.keystore -srcstoretype JKS -deststoretype PKCS12 -destkeystore test1.p12

jackcess 文档 jceks文件_android_02


亲测,导入成功

jackcess 文档 jceks文件_keystore_03

4)PKCS12—>keystore文件
<1>doc实现
keytool -v -importkeystore -srckeystore D:\test.p12 -srcstoretype PKCS12 -destkeystore D:\test.keystore -deststoretype JKS

jackcess 文档 jceks文件_pkcs12_04

jackcess 文档 jceks文件_jackcess 文档_05

jackcess 文档 jceks文件_jackcess 文档_06

如上就生成成功了
其中需要注意,在执行该doc命令之前,导入的keystore文件要不存在欧

5.快速实现

因为往往本人都是直接一次性,用doc命令 jsk—>keystore,整合下代码如下:
keytool -importkeystore -srckeystore D:\test.keystore -srcstoretype JKS -deststoretype PKCS12 -destkeystore test1.p12

keytool -v -importkeystore -srckeystore D:\test1.p12 -srcstoretype PKCS12 -destkeystore D:\test.keystore -deststoretype JKS