JKS、BKS、PFX证书格式之间转换
常用的证书密钥库格式:
JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。
JCEKS
在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDES)
PFX
(PKCS#12)是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。
BKS
来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。
UBER
比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此 keystore能够防止被误改、察看以及校验。SunJDK允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不 允许这种情况。
/**
* PFX证书转换为JKS(Java Key Store) *
*
* @param pfxPassword
* * PFX证书密码
* @param pfxFilePath
* * PFX证书路径
* @param jksPassword
* * JKS证书密码
* @param jksFilePath
* * JKS证书路径
*/
public static void covertPFXtoJKS(String pfxPassword, String pfxFilePath, String jksPassword,
String jksFilePath) {
FileInputStream fis = null;
FileOutputStream out = null;
try {
// 加载PFX证书 KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
fis = new FileInputStream(pfxFilePath);
char[] inPassword = pfxPassword == null ? null : pfxPassword.toCharArray();
char[] outPassword = jksPassword == null ? null : jksPassword.toCharArray();
inputKeyStore.load(fis, inPassword);
KeyStore outputKeyStore = KeyStore.getInstance("JKS");
outputKeyStore.load(null, outPassword);
Enumeration enums = inputKeyStore.aliases();
while (enums.hasMoreElements()) {
String keyAlias = enums.nextElement();
if (inputKeyStore.isKeyEntry(keyAlias)) {
Key key = inputKeyStore.getKey(keyAlias, inPassword);
Certificate[] certChain = (Certificate[]) inputKeyStore
.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, pfxPassword.toCharArray(),
(java.security.cert.Certificate[]) certChain);
}
}
out = new FileOutputStream(jksFilePath);
outputKeyStore.store(out, outPassword);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
if (out != null) {
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 从JKS格式转换为PKCS12格式 * @param jksFilePath * String JKS格式证书库路径
*
* @param jksPasswd
* * String JKS格式证书库密码
* @param pfxFilePath
* * String PKCS12格式证书库保存文件夹
* @param pfxPasswd
* * String PKCS12格式证书库密码
*/
public void covertJSKToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath,
String pfxPasswd) throws Throwable {
FileInputStream fis = null;
try {
KeyStore inputKeyStore = KeyStore.getInstance("JKS");
fis = new FileInputStream(jksFilePath);
char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();
char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray();
inputKeyStore.load(fis, srcPwd);
KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");
Enumeration 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);
java.security.cert.Certificate[] certChain = inputKeyStore
.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain);
}
String fName = pfxFolderPath + "_" + keyAlias + ".pfx";
FileOutputStream out = new FileOutputStream(fName);
outputKeyStore.store(out, destPwd);
out.close();
outputKeyStore.deleteEntry(keyAlias);
}
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 从BKS格式转换为PKCS12格式 *
*
* @param jksFilePath
* * String JKS格式证书库路径
* @param jksPasswd
* * String JKS格式证书库密码
* @param pfxFilePath
* * String PKCS12格式证书库保存文件夹
* @param pfxPasswd
* * String PKCS12格式证书库密码
*/
public void covertBKSToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath,
String pfxPasswd) throws Throwable {
FileInputStream fis = null;
try {
KeyStore inputKeyStore = KeyStore.getInstance("BKS",
new org.bouncycastle.jce.provider.BouncyCastleProvider());
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
fis = new FileInputStream(jksFilePath);
char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();
char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray();
inputKeyStore.load(fis, srcPwd);
KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");
Enumeration 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);
java.security.cert.Certificate[] certChain = inputKeyStore
.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain);
}
String fName = pfxFolderPath + "_" + keyAlias + ".pfx";
FileOutputStream out = new FileOutputStream(fName);
outputKeyStore.store(out, destPwd);
out.close();
outputKeyStore.deleteEntry(keyAlias);
}
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 列出JKS库内所有X509证书的属性 *
*
* @param jksFilePath
* * 证书库路径
* @param jksPasswd
* * 证书库密码
* @param algName
* * 库类型
*/
public static void listAllCerts(String jksFilePath, String jksPasswd, String algName) {
try {
char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();
FileInputStream in = new FileInputStream(jksFilePath);
KeyStore ks = KeyStore.getInstance(algName);
ks.load(in, srcPwd);
Enumeration e = ks.aliases();
while (e.hasMoreElements()) {
String alias = e.nextElement();
java.security.cert.Certificate cert = ks.getCertificate(alias);
if (cert instanceof X509Certificate) {
X509Certificate X509Cert = (X509Certificate) cert;
System.out.println("**************************************");
System.out.println("版本号:" + X509Cert.getVersion());
System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16));
System.out.println("主体名:" + X509Cert.getSubjectDN());
System.out.println("签发者:" + X509Cert.getIssuerDN());
System.out.println("有效期:" + X509Cert.getNotBefore());
System.out.println("签名算法:" + X509Cert.getSigAlgName());
System.out.println("输出证书信息:\n" + X509Cert.toString());
System.out.println("**************************************");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 列出BKS库内所有X509证书的属性 *
*
* @param jksFilePath * 证书库路径
*
* @param jksPasswd * 证书库密码
*
* @param algName * 库类型
*/
public static void listAllCertsBks(String jksFilePath, String jksPasswd, String algName) {
try {
char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();
FileInputStream in = new FileInputStream(jksFilePath);
KeyStore ks = KeyStore.getInstance(algName,
new org.bouncycastle.jce.provider.BouncyCastleProvider());
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
ks.load(in, srcPwd);
Enumeration e = ks.aliases();
while (e.hasMoreElements()) {
String alias = e.nextElement();
java.security.cert.Certificate cert = ks.getCertificate(alias);
if (cert instanceof X509Certificate) {
X509Certificate X509Cert = (X509Certificate) cert;
System.out.println("**************************************");
System.out.println("版本号:" + X509Cert.getVersion());
System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16));
System.out.println("主体名:" + X509Cert.getSubjectDN());
System.out.println("签发者:" + X509Cert.getIssuerDN());
System.out.println("有效期:" + X509Cert.getNotBefore());
System.out.println("签名算法:" + X509Cert.getSigAlgName());
System.out.println("输出证书信息:\n" + X509Cert.toString());
System.out.println("**************************************");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
原文链接地址: https://www.chinassl.net/faq/n511.html
JKS、BKS、PFX证书格式之间转换相关推荐
- 04-HTTPS证书格式及转换
PEM格式的证书文件(*.pem)由Base64编码的二进制内容和开头行(-----BEGIN CERTIFICATE-----).结束行(-----END CERTIFICATE-----)组成,支 ...
- 如何在 Unix 和 DOS 格式之间转换文本文件
本文介绍如何在 Unix 和 DOS 格式之间转换文本文件.DOS 文本文件带有回车符( \r )和换行符( \n )作为它们的换行符,而 Unix 文本文件只有( \n )换行符作为换行符. 有多种 ...
- xBIM 格式之间转换
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- PKI常见证书格式和转换
PKCS PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准. What is PK ...
- linux cer证书转为jks,常见SSL证书格式介绍以及SSL证书格式转化方法
我们大部分站长使用的SSL证书一般都是.CRT..KEY 这样子的文件,没错这个都是我们常用的Linux服务器Nginx环境的证书文件.不管我们是购买的付费SSL证书,还是使用的免费SSL证书看到的证 ...
- cdr存成html格式的文件格式,CDR必备!CDR保存与各种格式之间转换!-cdr文件用什么打开...
cdr功能毋庸置疑的强悍.只要发挥得当工资与地位自然是会让你得到你想要的.但在新手操作的时候总会出现这些或者那些一些问题,下面咱们就来总结一下cdr的打开方式与各种格式之间的转换吧! 一.cdr文件打 ...
- Cer Crt Pem Pfx 证书格式转换
1.从pfx格式的证书提取出密钥和证书 set OPENSSL_CONF=openssl.cnf openssl pkcs12 -in my.pfx -nodes -out server.pem op ...
- 证书格式pfx和cer的区别及转换
作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形 ...
- [SSL证书].pfx格式和.Cer格式的区别以及格式互相转换
现在很多网站都是用了ssl加密的https访问,而且现在网站不使用cdn的话简直是裸奔,但是目前用户最多的360网站卫士和腾讯云提供的免费配置ssl证书支持https访问功能都采取不一样格式的ssl证 ...
最新文章
- php 修改css 不生效,HTML外部引用CSS文件不生效原因分析及解决办法
- bookStore第二篇【图书模块、前台页面】
- python自定义异常类时、可以继承的类是_Python异常类型及处理、自定义异常类型、断言...
- 浅析 EF Core 5 中的 DbContextFactory
- .NET面试题系列(七)IIS
- opencv 叠加两张图_OpenCV基础篇之图片叠加
- 51单片机指针c语言,单片机C语言教程:C51指针的使用
- 鸡蛋掉落(动态规划)
- mysql数据库获得树的节点
- 九歌计算机在线作诗硬件原理,清华大学矣晓沅:「九歌」——基于深度学习的中国古典诗歌自动生成系统...
- c#通过126邮箱自动发送 微信端实现QQ邮箱邮件提醒
- 《众妙之门——网页排版设计制胜秘诀》——导读
- slice、splic、splite相互间的区别
- [5] Word 手把手教你写毕业论文-2
- html常用语义化元素和全局属性整理
- Allegro和Alitum Desiger PCB文件互转方法
- c语言蚂蚁搬,小蚂蚁搬豆阅读答案
- Docker容器之Docker Toolbox下配置国内镜像源-阿里云加速器(Windows)
- ML-常见目标检测算法
- python随机打乱一个文本中每行数据
热门文章
- NVIDIA Optimus技术和CUDA
- qcqa是什么职位_QC和QA是什么意思啊?
- python的ppt报告_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...
- Rotated IoU 计算
- Telnet是什么协议?如何使用?
- mars3d App开发——判定导航路线或者POI点是否被收藏
- 千兆车载以太网TSN(时间敏感网络)网络测试?TSN Box为您焕新
- 前端学习笔记2ady51
- Feathers教程之 使用 Feathers.js 和 SQLite 构建 REST API
- 东奔西走 花样百出魂牵梦萦 东奔西走