聊聊、Java Keytool P12 转 JKS
最近公司合作机构需要更改服务证书,总共给了 3 个文件过来。openapi-cert.p12、openapi-cert.key、openapi-cert.crt。
openapi-cert.crt - 客户端证书文件,用于盈米服务器验证客户端。
openapi-cert.key - 客户端证书文件的秘钥文件。
openapi-cert.p12 - 客户端证书文件的p12格式文件。
P12 的生成过程是 openssl pkcs12 -export -in openapi-cert.crt -inkey openapi-cert.key > openapi-cert.p12。实质上给过来的 P12(PKCS12) 文件不能直接导入 keyStore。直接导入会报 X.509 格式错误。因为 Java SSL 默认格式 JKS,那我们只能将 P12 转成 JKS。
谈下我用到的两种方法:
1.使用 keyTool 转换
keytool -v -importkeystore -srckeystore openapi-cert.p12 -srcstoretype PKCS12 -destkeystore tomcat.keystore -deststoretype JKS
2.使用 Java 类转换
package com.xxx.fpay.initdata.main; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Enumeration; public class PKCSToJKS { /**
* 从PKCS12格式转换为JKS格式
*
* @param srcFile
* String PKCS12格式的证书库
* @param srcPasswd
* String PKCS12格式的证书库密码
* @param destFile
* String JKS格式的证书库
* @param destPasswd
* String JKS格式的证书库密码
*/
public void PKCS12ToJKS(String srcFile, String srcPasswd, String destFile,
String destPasswd) {
try {
KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream(srcFile);
char[] srcPwd = null, destPwd = null;
if ((srcPasswd == null) || srcPasswd.trim().equals("")) {
srcPwd = null;
} else {
srcPwd = srcPasswd.toCharArray();
}
if ((destPasswd == null) || destPasswd.trim().equals("")) {
destPwd = null;
} else {
destPwd = destPasswd.toCharArray();
}
inputKeyStore.load(fis, srcPwd);
fis.close();
KeyStore outputKeyStore = KeyStore.getInstance("JKS");
outputKeyStore.load(null, destPwd);
Enumeration<String> enums = inputKeyStore.aliases();
while (enums.hasMoreElements()) {
String keyAlias = (String) enums.nextElement();
System.out.println("alias=[" + keyAlias + "]");
if (inputKeyStore.isKeyEntry(keyAlias)) {
Key key = inputKeyStore.getKey(keyAlias, srcPwd);
Certificate[] certChain = inputKeyStore
.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, destPwd,
certChain);
}
}
FileOutputStream out = new FileOutputStream(destFile);
outputKeyStore.store(out, destPwd);
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
} public static void main(String[] args) { PKCSToJKS c = new PKCSToJKS();
c.PKCS12ToJKS(
"D:/xxx/xxx/openapi-cert.p12",
"password1", "D:/xxx/xxx/tomcat.keystore",
"password2"); } }
这里的两个 password,第一个是 P12 准入密码,第二个是 JKS 准入密码。
当然也可以将 JKS 转 P12。
package com.lakala.fpay.initdata.main; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Enumeration; public class PKCSToJKS { /**
* 从JKS格式转换为PKCS12格式
*
* @param srcFile
* String JKS格式证书库
* @param srcPasswd
* String JKS格式证书库密码
* @param destFile
* String PKCS12格式证书库
* @param destPasswd
* String PKCS12格式证书库密码
*/
public void JSKToPKCS12(String srcFile, String srcPasswd, String
destFile, String destPasswd){
try {
KeyStore inputKeyStore = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream(srcFile);
char[] srcPwd = null, destPwd = null;
if ((srcPasswd == null) || srcPasswd.trim().equals("")) {
srcPwd = null;
} else {
srcPwd = srcPasswd.toCharArray();
}
if ((destPasswd == null) || destPasswd.trim().equals("")) {
destPwd = null;
} else {
destPwd = destPasswd.toCharArray();
}
inputKeyStore.load(fis, srcPwd);
fis.close();
KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");
Enumeration<String> enums = inputKeyStore.aliases();
while (enums.hasMoreElements()) {
String keyAlias = (String) enums.nextElement();
System.out.println("alias=[" + keyAlias + "]");
outputKeyStore.load(null, destPwd );
if (inputKeyStore.isKeyEntry(keyAlias)) {
Key key = inputKeyStore.getKey(keyAlias, srcPwd);
Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain);
}
String fName = destFile.substring(0, destFile.indexOf(".pfx"));
fName += "_" + keyAlias + ".pfx";
FileOutputStream out = new FileOutputStream(fName);
outputKeyStore.store(out, destPwd);
out.close();
outputKeyStore.deleteEntry(keyAlias);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
PKCSToJKS c = new PKCSToJKS();
c.JSKToPKCS12(
"D:/xxx/xxx/tomcat.keystore", "password1", "D:/xxx/xxx/openapi-cert.p12", "password2");
}
}
谢谢大家观看!希望有所帮助。
聊聊、Java Keytool P12 转 JKS的更多相关文章
- java keytool证书工具使用小结
java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt PEM-encod ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...
- java keytool证书工具使用小结【转】
java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程 -参考自http://lavasoft.blog.51cto.com/62575/1104993/
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...
- 常用的Java Keytool Keystore命令
Java keytool是密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.它还允许用户储存他们的 ...
- 聊聊java基础,int值强制类型转换成byte
聊聊java基础,int值强制类型转换成byte 知识点:byte.short.char在表达式中会自动提升为int 之前做一个应用时,打印IP地址,因为是用4个byte存储的,所以打印的时候值范围是 ...
- 简单聊聊java中的final关键字
简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...
- JVM:从实际案例聊聊Java应用的GC优化
原文转载自美团从实际案例聊聊Java应用的GC优化,感谢原作者的贡献 当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化.但GC算法复杂 ...
随机推荐
- 设置Cookie最大存活时间
Cookie和Session都是由Tomcat自动创建的对象,Cookie的默认最大存活时间是 -1 ,即当浏览器关闭时Cookie就消失了:Session的默认最大存活时间是30分钟. 使用Sess ...
- npm使用快速的安装源(nrm)
安装 npm install nrm --global 使用 nrm ls 切换安装源 nrm use taobao 测速 nrm test npm 参考地址:http://codingdict.co ...
- JAVA图形界面常用知识点总会《代码分析》
1. package CLASS16.bin.com.GridLayout; import javax.swing.ImageIcon;import javax.swing.JFrame;import ...
- GCD 代码以及GCD思想
# 欧几里得算法 现在,我们来学习一下欧几里得算法. 欧几里得算法又称辗转相除法,主要用于算求两个正数之间的最大公约数.对于最大公约数这个名称,其英文名称为(Greatest Common Divis ...
- 4G 内存 怎么只有2.99G可用
32为系统只可以识别3.25G,而且有256M的内存被显卡共享显存了,所以只剩2,99G.
- SpringMVC的controller层的方法返回值
1.ModelAndView 既带着数据,又返回视图路劲 2.String 返回试图路径 model带数据 (官方或企业推荐使用此种方式 ,此方法符合解耦思想,即数据,视图,分离 MVC) 3. ...
- 数据类型-------JavaScript
之前只是简单的学过JavaScript和JQuery,虽然一般的要求都能完成,但并没有深入,这次是看了一个网站,很详细的教学,想重新认识一下JavaScript和JQuery. 本文摘要:http:/ ...
- TCP/IP协议头部结构体
TCP/IP协议头部结构体(转) 网络协议结构体定义 // i386 is little_endian. #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN (1) ...
- c++ 函数指针应用,定义一个方法,传入两个参数和一个函数指针,并返回结果
#include <iostream> #include <string> using namespace std; double add(double x, double y ...
- linux关于软件安装和测试
软件都是盘上的安装之前确保已挂载完毕 1.安装软件 rpm -ivh httpd-2* 2.修改配置文件 vi /etc/httpd/conf/httpd.conf listen 8888 3 ...