聊聊、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算法复杂 ...
随机推荐
- python+selenium之多表单切换
在Web应用中经常会遇到fram/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于fram/iframe表单内嵌套页面上的元素无法直接定位.这是需要通过swit ...
- db2疑难解决
http://www-01.ibm.com/support/knowledgecenter/?lang=zh#!/SSEPGG_9.5.0/com.ibm.db2.luw.messages.sql.d ...
- SpringMVC Logback 设置及使用
http://b6ec263c.wiz03.com/share/s/2SX2oY0nX4f32CY5ax1bapaL1WPGHe1OeQ-J2ijprB04A67k
- MYSQL内置函数总结
时间转换为字符串: SELECT date_format(Date, '%Y-%m-%d %H:%i:%s' ) AS TimeFROMtable o convert函数转换为字符串的时候不存在类型为 ...
- Python-DDT实现接口自动化
Get请求参数化例子 import unittest import requests import ddt @ddt.ddt class MyTestCase(unittest.TestCase): ...
- MySql数据库中where的使用
SELECT * from runoob_tbl WHERE runoob_author='菜鸟教程'; MySQL 的 WHERE 子句的字符串比较是不区分大小写的. 你可以使用 BINARY 关键 ...
- js实现23种设计模式(收藏)
js实现23种设计模式 最近在学习面向对象的23种设计模式,使用java 和 javascript 实现了一遍,但是因为目前大三,还没有比较正规的大项目经验,所以学习的过程种我觉得如果没有一定的项目经 ...
- 安装IAR ewarm
一 安装准备 (ST方案) 1 嵌入式集成开发环境IAR ewarm 5.41 2 J-Link4.20 3 emberznet-4.3.0协议栈安装包 option1:tools - stm32软 ...
- 基于GPS\北斗、GIS、GPRS技术构建智能巡检系统
巡线工负责输油管网设施的日常巡查,可以及时发现管网设施是否完好.但巡检工作辛苦,加之管线在大部分情况下又处于良好状态,使得巡检人员麻痹大意,往往不能按规定程序进行巡检,造成巡检不到位,这样就不能从根本 ...
- mysql EOF
mysql shell 执行脚本 #!/bin/bash export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.6/bin:/usr ...