原创文章,鼓励转载请务必注明出处,作者:李佳
网上大多介绍如何使用openssl和keytool将pkcs12证书转为jks格式密钥库,很少有介绍jks转为pkcs12格式,原因是jks私钥无法用工具导出(至少我没找到导出的方法,如果哪位高手知道,希望指教).
具体步骤如下:
1.提取私钥
经过大量资料查找,终于找到一个可以提取jks密钥库中私钥的java程序:
package com.security.privatekey;
import sun.misc.BASE64Encoder;
import java.security.*;
import java.io.File;
import java.io.FileInputStream;
//EPKT.java
//Export private key tool
public class EPKT {
public static void main(String args[]) throws Exception{
// if(args.length!=5){
// System.err.println("usage:java EPKT JKS|PKCS12|JCEKS keystoreFile storePWD alias privPWD");
// System.exit(1);
// }
EPKT epkt = new EPKT();
// epkt.exec(args[0],args[1],args[2],args[3],args[4]);
epkt.exec("jks","C:/myfolder/Programs/bea/jdk150_04/bin/mykeystore2","helloworld","mytest","helloworld");
}
public void exec(String storeType,String storeFile,String storePWD,String alias,String privPWD) throws Exception{
//密钥库类型.
KeyStore ks = KeyStore.getInstance(storeType);
//密钥库
File file = new File(storeFile);
//密码
char[] pwd = storePWD.toCharArray();
//base64编码器
BASE64Encoder base64Encoder = new BASE64Encoder();
//打开密钥库
ks.load(new FileInputStream(file), pwd);
pwd=privPWD.toCharArray();
Key key = ks.getKey(alias, pwd);
//清空密码
pwd=null;
if (key instanceof PrivateKey) {
String privString = base64Encoder.encode(key.getEncoded());
System.out.println("-----BEGIN PRIVATE KEY-----");
System.out.println(privString);
System.out.println("-----END PRIVATE KEY-----");
}
}
}
2.将私钥保存在key.pem文件中.
3.合并成pfx证书
假设公钥证书文件名为client.crt, 私钥文件名为key.pem
使用openssl工具生成pfx证书 openssl pkcs12 -export -clcerts -in client.crt -inkey key.pem -out client.pfx
另外,找到个网站,OpenSSL在线生成合成PFX文件,大家可以试试https://www.myssl.cn/openssl/createpfx.asp