标准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操作的类,基于这个接口,实现了以下这个可是在两种格式之间互导的程序:
import java.security.KeyStore; import java.security.Key; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class KeyStoreConvert{ public static void main(String[] args){ convert(args[0],args[1],args[2],args[3],args[4],args[5], args[6],args[7],args[8],args[9],args[10]); //convert("JKS","test.jks","abc123","kp2","abc123","kp2", // "PKCS12","test.p12","abc123","kp2","abc123"); //convert("PKCS12","test.p12","abc123","kp2","abc123","kp2", // "JKS","test1.jks","abc123","kp2","abc123"); } public static void convert(String storeType1 , String stroe1FileName , String store1Passwd , String store1KeyAlias , String store1KeyPasswd , String store1CertChainAlias , String storeType2 , String store2FileName , String store2Passwd , String store2KeyAlias , String store2KeyPasswd ){ try{ FileInputStream fis = new FileInputStream(stroe1FileName); KeyStore keyStore1 = KeyStore.getInstance(storeType1); keyStore1.load (fis, 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(storeType2); keystore2.load(null, null); keystore2.setKeyEntry(store2KeyAlias, priKey, store2KeyPasswd.toCharArray(),keyStore1.getCertificateChain(store1CertChainAlias)); keystore2.store(new FileOutputStream(store2FileName), store2Passwd.toCharArray()); }catch(Exception e){ e.printStackTrace(System.out); } } }
在运行这个程序时,如果是将jks导成pkcs12,然后再将pkcs12格式导成jks,可以发现一个问题:jks中存储的是密钥对,需要将申请的证书导入jks和密钥配对,如果不将信任根(颁发给你证书的根)导入,那么配对证书是导入不到jks中的,可是像现在这样实现就可以产生一个没有根的jks——里面有包括配对的密钥+证书:
不过仔细想想这个也不是问题,因为产生这个问题的原因是有一个jks中已经包括根了。
最后缅怀一下sun(刚被收购)。。。