最近公司合作机构需要更改服务证书,总共给了 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的更多相关文章

  1. java keytool证书工具使用小结

    java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt    PEM-encod ...

  2. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  3. java keytool证书工具使用小结【转】

    java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...

  4. 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 ...

  5. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  6. 常用的Java Keytool Keystore命令

    Java keytool是密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.它还允许用户储存他们的 ...

  7. 聊聊java基础,int值强制类型转换成byte

    聊聊java基础,int值强制类型转换成byte 知识点:byte.short.char在表达式中会自动提升为int 之前做一个应用时,打印IP地址,因为是用4个byte存储的,所以打印的时候值范围是 ...

  8. 简单聊聊java中的final关键字

    简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...

  9. JVM:从实际案例聊聊Java应用的GC优化

    原文转载自美团从实际案例聊聊Java应用的GC优化,感谢原作者的贡献 当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化.但GC算法复杂 ...

随机推荐

  1. ImageLoader常用方法注释

    ImageLoader中的常用方法及相关作用注释 ImageLoader 的ImageLoaderConfiguration config 配置 ImageLoaderConfiguration co ...

  2. jsp页面file标签上传图片以及blob类型数据库存取。

    我的jsp页面表单如下: <form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" ...

  3. 利用jieba第三方库对文件进行关键字提取

    已经爬取到的斗破苍穹文本以TXT形式存储 代码 import jieba.analyse path = 'C:/Users/Administrator/Desktop/bishe/doupo.text ...

  4. 【Apache】HTTPD 2.4.37 + OpenSSL 1.1.1 企业级安全配置(含TLS修复)

    我为什么要写这一篇稿子? 为了避免更多的运维.开发者没能实现企业的信息安全,我将共享出我个人的HTTPD的安全修复(2.2和2.4差不太多就看2.4就好) 起因:我为某M工作,但因某M和testin合 ...

  5. 11gR2 如何诊断节点重启问题

    本文对如何诊断11gR2 GI环境下的节点重启问题进行了一些介绍. 首先,像10g版本一样,我们首先介绍在GI中能够导致节点重启的进程.1.Ocssd.bin:这个进程的功能和10g版本的功能基本差不 ...

  6. 网站被K怎么办?

    网站被K怎么办? 网站被K有几种状况,一种是网站的主页被删去或许网站悉数内容被删去就剩主页,还有一种是内容也在第“一”页,主页在后面,这种状况对初学者来讲是不会去留意的,他们会觉得这是正常的,其实这个 ...

  7. 2018.4.18 Ubuntu 的telnet命令详解

    Ubuntu 的telnet命令详解 1.作用用途 Telnet 命令通常用来远程登录,Telnet 程序是基于 Telnet 协议的远程登录客户端程序.Telnet 协议是TCP/IP协议族中的一员 ...

  8. C++ 内存分配操作符new和delete详解

    重载new和delete 首先借用C++ Primer 5e的一个例子: string *sp = new string("a value"); ]; 这其实进行了以下三步操作: ...

  9. 01_12_Struts2_访问Web元素

    01_12_Struts2_访问Web元素 1. 配置struts.xml文件 <package name="login" namespace="/login&qu ...

  10. B1002 写出这个数

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1. 输出格式: 在一行内输出 n 的 ...