Java不同类型密钥库之PKCS12和JCEKS

Android: AndroidKeyStore 对数据进行签名和验证 如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。 阅读详情

转:http://www.youkuaiyun.com/article/2015-01-06/2823434

Java不同类型密钥库之PKCS12和JCEKS

发表于 2015-01-06 11:32| 5234次阅读| 来源 优快云| 9 条评论| 作者 陈明
摘要:密钥库是一个存放加密密钥和证书的存储设施,它们经常用于SSL通信来标明服务器和客户机的身份,本文所列的为Java密钥库中的PKCS12和JCEKS类型。介绍了其存储和加载密钥、证书所使用的代码片段。

编者注:密钥库是一个存放加密密钥和证书的存储设施,它们经常用于SSL通信来标明服务器和客户机的身份,一个密钥库可以是一份文件或硬件设备。Java中不同类型的密钥库包含:PrivateKey、SecretKey、JKS、PKCS12、JCEKS等。其中JKS的详细介绍可参考《Java不同密钥库类型之JKS》。本文所讲诉的为PKCS12和JCEKS的用法。

以下为译文:

JCEKS

JCEKS是Java平台的一个密钥库格式,将密钥存储在密钥库中以防止加密密钥的暴露。在JCEKS中存储和装载不同条目的过程类似于JKS,只需在调用KeyStore.getInstance()时更改相应的JCEKS密钥库类型。

存储密钥

密钥可以通过一下代码存储到JCEKS中:

try{
    KeyStore keyStore = KeyStore.getInstance("JCEKS");
    keyStore.load(null, null);
     
    KeyGenerator keyGen = KeyGenerator.getInstance("DES");
    keyGen.init(56);;
    Key key = keyGen.generateKey();
     
    keyStore.setKeyEntry("secret", key, "password".toCharArray(), null);
     
    keyStore.store(new FileOutputStream("output.jceks"), "password".toCharArray());
} catch (Exception ex) {
    ex.printStackTrace();
}

加载密钥

代码如下:

try{
    KeyStore keyStore = KeyStore.getInstance("JCEKS");
    keyStore.load(new FileInputStream("output.jceks"), "password".toCharArray());
     
    Key key = keyStore.getKey("secret", "password".toCharArray());
     
    System.out.println(key.toString());
} catch (Exception ex) {
    ex.printStackTrace();
}

输出代码:

javax.crypto.spec.SecretKeySpec@fffe7b9b

PKCS12

PKCS12是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,在windows中可以直接导入到密钥区。注意,PKCS12的密钥库保护密码同时也用于保护Key。

创建PKCS12密钥库

在把一个条目存入PKCS12之前必须先加载密钥库,这意味着我们必须首先创建一个密钥库。简单创建一个PKCS12密钥库的方式如下:

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(null, null);
     
    keyStore.store(new FileOutputStream("output.p12"), "password".toCharArray());
} catch (Exception ex){
    ex.printStackTrace();
}

需要注意的是,在调用keyStore.load(null, null)时,两个null是作为输入密钥流和密码传递的。这是因为我们没有可用的密钥库。运行这段代码后,当前工作目录中应该会输出一个名为output.p12的文件。

存储密钥

代码如下:

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(null, null);
     
    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    keyGen.init(128);
    Key key = keyGen.generateKey();
    keyStore.setKeyEntry("secret", key, "password".toCharArray(), null);
     
    keyStore.store(new FileOutputStream("output.p12"), "password".toCharArray());
} catch (Exception ex){
    ex.printStackTrace();
}

存储私钥

密钥库包含可用于网络上的SSL通信的私钥和证书:

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
//  keyStore.load(new FileInputStream("output.p12"),"password".toCharArray());
    keyStore.load(null, null);;
     
    CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
    gen.generate(1024);
      
    Key key=gen.getPrivateKey();
    X509Certificate cert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600);
      
    X509Certificate[] chain = new X509Certificate[1];
    chain[0]=cert;
      
    keyStore.setKeyEntry("private", key, "password".toCharArray(), chain);
      
    keyStore.store(new FileOutputStream("output.p12"), "password".toCharArray());
}catch(Exception ex){
    ex.printStackTrace();
}

别忘了调用keyStore.store()来保存密钥,否则条目在程序退出时会丢失。

存储证书

存储证书可以调用KeyStore.setCertificateEntry():

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
//  keyStore.load(new FileInputStream("output.p12"),"password".toCharArray());
    keyStore.load(null, null);;
     
    CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
    gen.generate(1024);
      
    X509Certificate cert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600);
      
    keyStore.setCertificateEntry("cert", cert);
      
    keyStore.store(new FileOutputStream("output.p12"), "password".toCharArray());
}catch(Exception ex){
    ex.printStackTrace();
}

存储的证书可以通过调用提供别名的KeyStore.getCertificate() 来提取,例如:

Certificate cert = keyStore.getCertificate("cert");

加载私钥

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(new FileInputStream("output.p12"), "password".toCharArray());
     
    Key pvtKey = keyStore.getKey("private", "password".toCharArray());
    System.out.println(pvtKey.toString());
} catch (Exception ex){
    ex.printStackTrace();
}

代码输出:

sun.security.rsa.RSAPrivateCrtKeyImpl@ffff2466

加载证书链

如果一个证书链存在密钥库中,我们可以通过调用KeyStore.getCertificateChain()来加载:

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(new FileInputStream("output.p12"), "password".toCharArray());
     
    Key pvtKey = keyStore.getKey("private", "password".toCharArray());
    System.out.println(pvtKey.toString());
     
    java.security.cert.Certificate[] chain =  keyStore.getCertificateChain("private");
    for(java.security.cert.Certificate cert:chain){
        System.out.println(cert.toString());
    }
} catch (Exception ex){
    ex.printStackTrace();
}

输出:

[
[
  Version: V3
  Subject: CN=ROOT
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
 
  Key:  Sun RSA public key, 1024 bits
  modulus: 107262652552256813768678166856978781385254195794582600239703451044252881438814396239031781495369251659734172714120481593881055888193254336293673302267462500060447786562885955334870856482264000504019061160524587434562257067298291769329550807938162702640388267016365640782567817416484577163775446236245223552189
  public exponent: 65537
  Validity: [From: Mon Jan 05 13:03:29 SGT 2015,
               To: Tue Jan 05 13:03:29 SGT 2016]
  Issuer: CN=ROOT
  SerialNumber: [    5e5ca8a4]
 
]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 22 21 BF 73 A6 6D 12 9B   F7 49 6C 0E B3 50 6A 9D  "!.s.m...Il..Pj.
0010: FA 30 43 22 32 FF 54 95   80 2E B3 8B 6F 59 D4 B5  .0C"2.T.....oY..
0020: 6C A6 AE 89 B7 18 9A A8   35 7D 65 37 BF ED A3 F4  l.......5.e7....
0030: E7 DB 5D 5F 9B DA 4B FA   39 04 9B 4D DB C2 3E FA  ..]_..K.9..M..>.
0040: 3B C2 63 F8 1E BE 03 F3   BD 1C D4 8A 8E 3C 51 68  ;.c..........

注:如何在Java中创建证书链?可参考:点此进入

加载证书

加载证书可以通过调用KeyStore.getCertificate()来实现:

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(new FileInputStream("output.p12"), "password".toCharArray());
     
    java.security.cert.Certificate cert =  keyStore.getCertificate("private");
    
    System.out.println(cert);
} catch (Exception ex){
    ex.printStackTrace();
}

输出:

[
[
  Version: V3
  Subject: CN=ROOT
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
 
  Key:  Sun RSA public key, 1024 bits
  modulus: 107262652552256813768678166856978781385254195794582600239703451044252881438814396239031781495369251659734172714120481593881055888193254336293673302267462500060447786562885955334870856482264000504019061160524587434562257067298291769329550807938162702640388267016365640782567817416484577163775446236245223552189
  public exponent: 65537
  Validity: [From: Mon Jan 05 13:03:29 SGT 2015,
               To: Tue Jan 05 13:03:29 SGT 2016]
  Issuer: CN=ROOT
  SerialNumber: [    5e5ca8a4]
 
]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 22 21 BF 73 A6 6D 12 9B   F7 49 6C 0E B3 50 6A 9D  "!.s.m...Il..Pj.
0010: FA 30 43 22 32 FF 54 95   80 2E B3 8B 6F 59 D4 B5  .0C"2.T.....oY..
0020: 6C A6 AE 89 B7 18 9A A8   35 7D 65 37 BF ED A3 F4  l.......5.e7....
0030: E7 DB 5D 5F 9B DA 4B FA   39 04 9B 4D DB C2 3E FA  ..]_..K.9..M..>.
0040: 3B C2 63 F8 1E BE 03 F3   BD 1C D4 8A 8E 3C 51 68  ;.c..........

导入导出密钥和证书

PKCS12密钥库可以用于导入导出密钥和证书,下面的代码演示了从PKCS12导出一个私钥并导入到JKS密钥库中:

try{
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(new FileInputStream("output.p12"), "password".toCharArray());
     
    Key pvtKey = keyStore.getKey("private", "password".toCharArray());
    java.security.cert.Certificate[] chain =  keyStore.getCertificateChain("private");
     
    KeyStore jksStore = KeyStore.getInstance("JKS");
    jksStore.load(null, null);;
    jksStore.setKeyEntry("jksPrivate", pvtKey, "newpassword".toCharArray(), chain);
    jksStore.store(new FileOutputStream("output.jks"), "password".toCharArray());
} catch (Exception ex){
    ex.printStackTrace();
}

解决 Java 加载 pfx 报密码错误 解决Java (Corretto 8) 在加载 AES256-SHA256 加密格式的 fpx 文件时报密码错误 阅读详情

相关推荐

JKS和PKCS12密钥容器相互转换

package com.xgh.keystore.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.GeneralSecurityException; import java.security.Key; import java.security.KeyStore;

down177的专栏 3060

JAVA加载keystore文件,获取公钥和私钥

总结java如何加载keystore文件,获取公私钥信息 /** * Java密钥库(Java Key Store,JKS)KEY_STORE */ private static final String KEY_STORE = "JKS"; private static final String X509 = "X.509"; /** * 从公钥文件当中读取公钥,公钥文件存储在设备某个特定位置 * * @par......

chali1314的博客 9235

研一小白投稿SCI:Applied Intelligence从提交到Under Review的保姆级避坑指南

本文为研一学生提供Applied Intelligence期刊投稿的详细指南,涵盖格式校验、状态解析及审稿回应策略。特别强调声明文件、LaTeX模板的常见错误及应对方法,帮助新手避开高频踩坑点,提升投稿成功率。

weixin_29230805的博客 495

java jceks 密钥_Java不同类型密钥库之PKCS12和JCEKS

编者注:密钥库是一个存放加密密钥和证书的存储设施,它们经常用于SSL通信来标明服务器和客户机的身份,一个密钥库可以是一份文件或硬件设备。Java中不同类型的密钥库包含:PrivateKey、SecretKey、JKS、PKCS12、JCEKS等。其中JKS的详细介绍可参考《Java不同密钥库类型之JKS》。本文所讲诉的为PKCS12和JCEKS的用法。以下为译文:JCEKSJCEKS是Java平台...

weixin_33204898的博客 467

金属粘结剂喷射3D打印技术:工艺流程与后处理关键

金属粘结剂喷射(Binder Jetting)是一种创新的增材制造技术,通过逐层喷射粘合剂将金属粉末粘结成型,再经过脱脂和烧结等后处理工序获得最终零件。这项技术的核心优势在于无需支撑结构、可实现批量生产,并且材料利用率高。在3D打印领域,金属BJ技术特别适合中小尺寸、结构复杂且表面质量要求高的零件生产。其工艺流程包括前期数据处理、打印生胚阶段、拆包与清粉,以及关键的渗透、脱脂和烧结后处理环节。后处理工艺的控制直接决定了零件的机械性能和尺寸精度,其中烧结工艺尤为关键,需要精确控制温度曲线和气氛环境。金属BJ打

weixin_35751194的博客 86

生存分析机器学习问题

然而,随着人工智能 (AI) 和机器学习 (ML) 的兴起,科学家现在能够开发更复杂的模型,揭示这些数据集中的模式和特征,从而为癌症的生物学、诊断、预后、治疗和预后提供新的见解。病情更重的患者可能接受更强(或更弱)的治疗,导致治疗方案与不良预后(死亡)强相关。数据集中包含失访或研究结束时仍存活的患者(删失数据),他们的真实生存时间未知,仅知道其存活时间不低于观察到的最后一次随访时间。优先选择参数少、结构简单的模型(如带强正则化的线性模型、简单树模型),避免复杂模型(如深度神经网络)。时刻的状态是未知的。

4AM_明朝百晓生 1223

Java中不同类型的密钥库——概述

java keytool工具 签名类型科普

717

SAP SD 顾问面试问题 consultant interview questionnaire

以下是我个人目前面试团队 SD顾问问题的小结,希望对大家有所帮助, 也可能有回答错误的地方,希望同行不吝赐教。 也希望各位顾问们讲你们遇到的一些面试问题做个跟贴,方便大家共同进步,谢谢。   面试问题清单:  一、销售订单类型影响: 可用性检查,交货类型,输出,信贷,定价,需求,报表,合作伙伴,文本,不完整日志,交货开票,订单开票,公司间开票,统计组,屏幕顺序组,参数文件...

weixin_33825683的博客 1809

java 密钥库_Java密钥库的不同类型 -- 概述

机器翻译Different types of keystore in Java -- OverviewJava密钥库的不同类型-- 概述Keystore is a storage facility to store cryptographic keys and certificates. They are most frequently used in SSL communications to...

weixin_29726381的博客 878

【Bug已解决】Codex CLI 运行时出现 command not found: codex 解决方案

方案适用场景推荐指数修复 PATH 配置最常见的基础排查方向⭐⭐⭐⭐⭐检查原生二进制完整性PATH 正常但执行仍然异常⭐⭐⭐⭐统一包管理器混用多种包管理器导致混乱⭐⭐⭐⭐确认安装脚本未被跳过CI/CD 或企业策略环境⭐⭐⭐⭐排查网络下载渠道企业内网/受限网络环境⭐⭐⭐需要留意 warning 中是否涉及脚本执行失败、网络超时重试等信息,这类 warning 往往是后续问题的前兆,建议出现明显的下载/网络相关警告时就主动重新安装一次确认。Codex CLI 报。

一键难忘的博客 1万+

DeepSeek:为文化创意产业注入AI新动能

沪南胜境,闵行新章。随后,2024 年 5 月,DeepSeek 宣布开源第二代 MoE 大模型 DeepSeek-V2,以其比肩 GPT-4Turbo 的卓越性能,以及仅为 GPT-4 百分之一的价格优势,迅速在市场中掀起波澜,收获了 “AI 届拼多多” 的独特名号,让更多人看到了高性价比 AI 大模型的可能性。创作者自身也应提高对创作伦理的认识,树立正确的创作观念,在使用 AI 工具时,保持对创作的主导权,充分发挥自己的创造力和想象力,将 AI 作为创作的辅助工具,而不是替代品。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1962

java 密钥库_Java中不同类型的密钥库 -- 概述

机器翻译Different types of keystore in Java -- OverviewJava中不同类型的密钥库 -- 概述Keystore is a storage facility to store cryptographic keys and certificates. They are most frequently used in SSL communications t...

weixin_39540725的博客 237

SAP S/4 FICO科目辅助余额表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP S/4 FICO科目辅助余额表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 329

Keystore介绍

Java中不同类型的密钥库(Keystore) – 概述 密钥库是用于存储加密密钥和证书的存储工具 ,最常用于SSL通信,以证明服务器和客户端的身份。密钥库可以是文件或硬件设备。有三种类型的条目可以存储在密钥库中,取决于密钥库的类型,这三种类型的条目分别是: PrivateKey:用于非对称加密的密钥,通常由于其敏感性而受密码保护。它还可用于签署数字签名; Certificate证书:证书包含一个公钥,可以识别证书中声明的主题 (Subject)。它通常用于验证服务器的身份。有时,它还用于在请求时识别客户端

Talent1223的博客 8238

【WRF理论第十四期】 VEGPARM.TBL 文件详解

WRF 读取 VEGPARM.TBL 文件

WW、forever的博客 576

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java jceks 密钥_java - 密钥库类型:使用哪一个?

JKS,Java Key Store。 你可以在这里找到这个文件sun.security.provider.JavaKeyStore。 这个密钥库是Java特有的 通常有jks的扩展名。 这种类型的密钥库可以包含 私钥和证书,但它不能用于存储密钥键。 由于它是Java特定的密钥库,因此无法使用 其他编程语言。JCEKS,JCE钥匙店。 你可以在这里找到这个文件com.sun...

weixin_32346177的博客 363

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java 证书公钥 私钥_Java 密钥库 证书 公钥 私钥

Java 密钥库 证书 公钥 私钥1.密钥库密钥库keystore是存储一个或多个密钥条目的文件,每个密钥条目以一个别名标识,它包含密钥和证书相关信息。可以使用java自带工具keytool生成,也可以通过程序编码实现。密钥库文件格式(实际上,扩展名并不重要),比较常用的是jks和pkcs12。格式扩展名描述特点JKS.jks/.ks密钥库的Java实现版本,provider为SUN密钥库和私钥用...

weixin_39620535的博客 938

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

证书导入keystore

简介 Java自带的keytool工具是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。 keytool 将密钥和证书储存在一个所谓的密钥仓库(keystore)中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥

1万+

Different types of keystore in Java Overview

Different types of keystore in Java JKS DKS JCEKS PKCS12 PKCS11 http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview android keystore type .keystore ...

weixin_30344995的博客 148

java keytool支持的类型及如何将证书导入jks中

java keytool支持的类型及如何将证书导入jks中 - 优快云博客 http://blog.csdn.net/a351945755/article/details/23195713/ 简介 Java自带的keytool工具是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整...

MAIMIHO的博客 2118

java 加密知识整理(未完)

以下为网络转载,如有侵权请告知以便改正。 JKS JCEKS PKCS12 BKS UBER   转一篇文章: http://hi.baidu.com/beyond456/blog/item/a3a009d7479b44d9a044df32.html 密钥:我理解是公钥+私钥的统称。 密钥对:公钥(证书)和私钥成对存在。通信双方各持有自己的私钥和对方的公钥。自己的私钥需密切保护...

mywayscut的专栏 566
上一篇: 公众平台调整SSL安全策略,请开发者注意升级
下一篇: Java-JSSE-SSL/TLS编程代码实例-双向认证
lcathm
博客等级 码龄18年 37粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值