java常见证书类型和密钥库类型

java常见证书类型和密钥库类型一 证书类型 nbsp nbsp 1 证书概念 nbsp nbsp nbsp 证书是对现实生活中某个人或者某件物品的价值体现比如古董颁发见证书 人颁发献血证等通常证书会包含以下内容证书拥有者名称 CN 组织单位 OU 组织 O 城市 L 区 ST 国家 地区 C nbsp nbsp nbsp 证书的过期时间证书的颁发机构证书颁发机构对证书的签名 签名算法 对象的公钥等 nbsp nbsp nbsp nbsp 数字证书的格式遵循 X 5

一 。证书类型

   1》证书概念:

      证书是对现实生活中 某个人或者某件物品的价值体现 比如古董颁发见证书 ,人颁发献血证等 通常证书会包含以下内容

证书拥有者名称(CN),组织单位(OU)组织(O),城市(L) 区(ST) 国家/地区( C )

      证书的过期时间 证书的颁发机构 证书颁发机构对证书的签名,签名算法,对象的公钥等

      数字证书的格式遵循X.509标准。X.509是由国际电信联盟(ITU-T)制定的数字证书标准。

   2》证书类型(表格采集自网络)

 

格式

扩展名

描述

特点

DER

.cer/.crt/.rsa

【ASN .1 DER】用于存放证书

不含私钥、二进制

PKCS7

.p7b/.p7r

【PKCS #7】加密信息语法标准

CMS

.p7c/.p7m/.p7s

【Cryptographic Message Syntax】

PEM

.pem

【Printable Encoded Message】

1、该编码格式在RFC1421中定义,其实PEM是

PKCS10

.p10/.csr

【PKCS #10】公钥加密标准【Certificate Signing Request】

SPC

.pvk/.spc

【Software Publishing Certificate】

 

 

二。密钥库类型

    1》秘钥库概念:所有的公钥和私钥同证书都会被存储在密钥库中 因为证书需要被签名 签名必须使用非对称加密算法+HASH算法 所以

   一般是MD5WithRSA或者 SHA1WithRSA (表格采集自网络)

 

格式

扩展名

描述

特点

JKS

.jks/.ks

【Java Keystore】密钥库的Java实现版本,provider为SUN

密钥库和私钥用不同的密码进行保护

JCEKS

.jce

【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE

相对于JKS安全级别更高,保护Keystore私钥

时采用TripleDES

PKCS12

.p12/.pfx

【PKCS #12】个人信息交换语法标准

BKS

.bks

【Bouncycastle Keystore】密钥库的BC实现版本,provider为BC

基于JCE实现

UBER

.ubr

【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC

 

 

三。使用java的keytool生成证书

   生成证书以及证书对应的公钥和私钥都可以被存储在秘钥库中 同一个秘钥库中可以存储多个证书  秘钥库必须设置一个访问的口令 防止被盗

 证书中包含公钥 证书和私钥如果需要单独存储 需要分开在不同的文件 也可以放在同一个秘钥库中

 

  
  1. 秘钥库可以单独存储证书条目(trustedCertEntry) 表示信任的证书,
  2. 秘钥库可以存储生成的证书和私钥(PrivateKeyEntry)

 

 keytool /?查看所有的子命令

 

  
  1. C:\Users\jiaozi>keytool
  2. 密钥和证书管理工具
  3.  
  4. 命令:
  5.  
  6. -certreq 生成证书请求
  7. -changealias 更改条目的别名
  8. -delete 删除条目
  9. -exportcert 导出证书
  10. -genkeypair 生成密钥对
  11. -genseckey 生成密钥
  12. -gencert 根据证书请求生成证书
  13. -importcert 导入证书或证书链
  14. -importkeystore 从其他密钥库导入一个或所有条目
  15. -keypasswd 更改条目的密钥口令
  16. -list 列出密钥库中的条目
  17. -printcert 打印证书内容
  18. -printcertreq 打印证书请求的内容
  19. -printcrl 打印 CRL 文件的内容
  20. -storepasswd 更改密钥库的存储口令

   keytool -genkeypair /?查看genkeypair的子命令  

 

 

  
  1. C:\Users\jiaozi>keytool -genkeypair /?
  2. 非法选项: \a
  3. keytool -genkeypair [OPTION]...
  4. 生成密钥对
  5. 选项:
  6. -alias

    要处理的条目的别名
  7. -keyalg

    密钥算法名称
  8. -keysize

    密钥位大小
  9. -sigalg

    签名算法名称
  10. -destalias

    目标别名
  11. -dname

    唯一判别名
  12. -startdate

    证书有效期开始日期/时间
  13. -ext

    X.509 扩展
  14. -validity

    有效天数
  15. -keypass

    密钥口令
  16. -keystore

    密钥库名称
  17. -storepass

    密钥库口令
  18. -storetype

    密钥库类型
  19. -providername 提供方名称
  20. -providerclass 提供方类名
  21. -providerarg

    提供方参数
  22. -providerpath 提供方类路径
  23. -v 详细输出
  24. -protected 通过受保护的机制的口令

常用的命令

》》keytool -genkeypair -alias 被存储在秘钥库的证书名称  -keystore 证书的位置(默认当前工作目录下 文件名 .keystore)  -storepass 密钥库的口令

-validity 有效期的天数 -keypass 秘钥口令

例如(输入证书拥有者个人信息)

  keytool -genkeypair  -keystore c:/a.keystore -alias test

  再增加一个证书

  keytool -genkeypair  -keystore c:/a.keystore -alias test1

》》查看密钥库的证书列表(密续输入秘钥库的密码才能查看) java默认的密钥库为JKS

 

  
  1. keytool -list -keystore c:/a.keystore -storepass
  2.  
  3. 密钥库类型: JKS
  4. 密钥库提供方: SUN
  5.  
  6. 您的密钥库包含 2 个条目
  7.  
  8. test, 2017-7-24, PrivateKeyEntry,
  9. 证书指纹 (SHA1): DD:34:11:3F:2C:D8:6B:4D:71:F5:C9:40:E9:91:7E:A9:9A:C5:9E:9D
  10. test1, 2017-7-24, PrivateKeyEntry,
  11. 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9

》》导出证书到单独证书文件(可以导出别名为test或者test1的证书)

 

  
  1. C:\Users\jiaozi>keytool -exportcert -alias test -file c:/a.cer -keystore c:/a.k
  2. eystore -storepass
  3. 存储在文件

    中的证书

》》添加证书到秘钥库中

 

  
  1. C:\Users\jiaozi>keytool -importcert -alias test2 -file c:/a.cer -keystore c:/a.
  2. keystore -storepass
  3. 在别名

    之下, 证书已经存在于密钥库中
  4. 是否仍要添加? [否]: y
  5. 证书已添加到密钥库中
  6.  
  7. C:\Users\jiaozi>keytool -list -keystore c:/a.keystore -storepass
  8. 密钥库类型: JKS
  9. 密钥库提供方: SUN
  10. 您的密钥库包含 3 个条目
  11. test, 2017-7-24, PrivateKeyEntry,
  12. 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9
  13. test1, 2017-7-24, PrivateKeyEntry,
  14. 证书指纹 (SHA1): DD:34:11:3F:2C:D8:6B:4D:71:F5:C9:40:E9:91:7E:A9:9A:C5:9E:9D
  15. test2, 2017-7-24,trustedCertEntry ,
  16. 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9

》》数据证书签发申请 csr

 首先 假设生成一个根证书  默认是自己颁发给自己也就是自签名证书

 

  
  1. C:\Users\jiaozi>keytool -genkeypair -keystore c:/root.keystopre
  2. 输入密钥库口令:
  3. 再次输入新口令:
  4. 您的名字与姓氏是什么?
  5. [Unknown]: jiaozi
  6. 您的组织单位名称是什么?
  7. [Unknown]: yt
  8. 您的组织名称是什么?
  9. [Unknown]: ytgroup
  10. 您所在的城市或区域名称是什么?
  11. [Unknown]: zh_CN
  12. 您所在的省/市/自治区名称是什么?
  13. [Unknown]: gd
  14. 该单位的双字母国家/地区代码是什么?
  15. [Unknown]: china
  16. CN=jiaozi, OU=yt, O=ytgroup, L=zh_CN, ST=gd, C=china是否正确?
  17. [否]: y
  18.  
  19. 输入

    的密钥口令
  20. (如果和密钥库口令相同, 按回车):
  21.  
  22. C:\Users\jiaozi>keytool -list -keystore c:/root.keystopre
  23. 输入密钥库口令:
  24.  
  25. 密钥库类型: JKS
  26. 密钥库提供方: SUN
  27.  
  28. 您的密钥库包含 1 个条目
  29.  
  30. mykey, 2017-7-24, PrivateKeyEntry,
  31. 证书指纹 (SHA1): 0F:E3:40:B2:B8:D0:7A:D2:91:7D:CC:E5:38:16:96:D8:C8:FF:05:E0

使用该证书签发其他的证书

1》创建一个需要被root签名的证书 同上(默认的别名是mykey   输入名字和姓氏为p2p)

     keytool -genkeypair -keystore c:/my.keystopre

2》创建证书请求(也就是将my.keystore中创建的证书 进行签名请求  该文件时csr文件)

     keytool -certreq -alias mykey -keystore c:\my.keystore -file c:\my.csr

3》需要将my.csr 通过root.keystore证书签名 生成新的证书

    双击my.cer可以看到 确实是根证书的jiaozi颁发给了被签名证书的p2p

    java常见证书类型和密钥库类型

证书路径确没有显示正确的结构 应该是jiaozi下的子节点是p2p 这里是因为根节点没有被系统信任

java常见证书类型和密钥库类型

需要将根证书导入到系统受信任的颁发机构中  以后所有根证书签发的证书都是被信任的 

导出root.keystore中的根证书 

 keytool -exportcert -keystore root.keystore -file c:\rootca.cer

设置如下:

打开chrome浏览器  选择 选项或者设置  点击高级   管理证书选项  点开 收信任的根证书颁发机构  点击左下角导入 下一步 选择 被签名的

java常见证书类型和密钥库类型

导入成功后可以看到

java常见证书类型和密钥库类型

》》给jar包签名(jarsigner -keystore c:\root.keystore 被签名jar的路径 keystore中的别名)

  jarsigner -keystore c:\root.keystore ref.jar mykey  签名后META-INF 会生成一些文件 其实就是对类进行的摘要 这个会直接在jar包本省签名

》》其他命令 比如从密钥库删除条目等参考帮助

 

四。使用java编码操作证书和密钥库

  
  1. /
  2. *java默认密钥库为jks 支持PKCS12,JCEKS等
  3. *JCEKS支持 秘钥 支持信任证书和私钥
  4. *JKS和PKCS支持信任证书和私钥 不支持单独秘钥
  5. * @throws NoSuchAlgorithmException
  6. */
  7. public static void main(String[] args) throws Exception {
  8. KeyStore keyStore = KeyStore.getInstance("JCEKS");
  9. keyStore.load(null,null);
  10. KeyGenerator keyGen = KeyGenerator.getInstance("AES");
  11. keyGen.init(128);//128, 192 or 256
  12. SecretKey sk=keyGen.generateKey();
  13. //单独只是存储一个秘钥 如果是JKS和PKCS 会抛出错误 不支持单独秘钥
  14. keyStore.setKeyEntry("key1", sk, "".toCharArray(), null);
  15. //存储信任的证书
  16. InputStream is=new FileInputStream("c:/a.cer");
  17. CertificateFactory cf = CertificateFactory.getInstance("X.509");
  18. X509Certificate cert = (X509Certificate)cf.generateCertificate(is);
  19. keyStore.setCertificateEntry("cert1", cert);
  20. //存储非对称加密的证书和私钥
  21. CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
  22. gen.generate(1024);
  23. X509Certificate mycert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600);
  24. PrivateKey pk=gen.getPrivateKey();
  25. keyStore.setKeyEntry("myrsa", pk, "".toCharArray(),new Certificate[]{ mycert});
  26. keyStore.store(new FileOutputStream("c:/ttt.keystore"), "".toCharArray());
  27. }

使用命令查看秘钥库

 

  
  1. C:\Users\jiaozi>keytool -list -keystore c:/ttt.keystore -storepass -storetype JCEKS
  2.  
  3. 密钥库类型: JCEKS
  4. 密钥库提供方: SunJCE
  5.  
  6. 您的密钥库包含 3 个条目
  7.  
  8. myrsa, 2017-7-24, PrivateKeyEntry,
  9. 证书指纹 (SHA1): 82:C1:A5:10:4A:B1:6A:DC:88:01:88:FF:79:73:B7:B0:47:B6:F1:95
  10. key1, 2017-7-24, SecretKeyEntry,
  11. cert1, 2017-7-24, trustedCertEntry,
  12. 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222341.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:00
下一篇 2026年3月17日 下午4:00


相关推荐

  • UAT环境[通俗易懂]

    UAT环境[通俗易懂]公司上班,会给你数据库账号,SVN等一系列配置。在企业级软件的测试过程中,经常会划分为三个阶段——单元测试,SIT和UAT,如果开发人员足够,通常还会在SIT之前引入代码审查机制(CodeReview)来保证软件符合客户需求且流程正确。下面简单介绍一下SIT和UAT的基本情况。SIT(SystemIntegrationTesting)系统集成测试,也叫做集成测试,是软件测试的一个术语,…

    2022年9月30日
    6
  • 彻底解决mysql报错:1030, ‘Got error 28 from storage engine‘

    彻底解决mysql报错:1030, ‘Got error 28 from storage engine‘恕我直言,网上文章千篇一律,没一个能解决的,全是说清一下内存就好了,但是并没有教不会的小白清理…==这个问题确实是服务器系统盘满了,mysql指定的临时文件目录满掉,大概就是这个意思.下面解决/dev/vda1系统盘满了,其实我压根不知道/dev/vda1这在哪,是什么,后来了解这是virtio-block类型的设备。科普一下:以’c’开头的一行表示该设备是一个……

    2022年10月21日
    4
  • Linux 查看cuda cudnn版本

    Linux 查看cuda cudnn版本cudacat usr local cuda version txtcudnncat usr local cuda include cudnn h grepCUDNN MAJOR A2

    2026年3月26日
    2
  • python里的def 方法中->代表什么意思?

    python里的def 方法中->代表什么意思?功能注释函数注释是关于用户定义函数使用的类型的完全可选元数据信息(请参阅PEP3107和 PEP484了解更多信息)。注释__annotations__ 作为字典存储在函数

    2022年7月6日
    27
  • 小波变换 完美通俗解读

    小波变换 完美通俗解读申明 小波变换完美通俗解读 是 小波变换和 motion 信号处理 系列中的第一篇 原始出处为 windstorm 的网站 http www kunli info 并非本站原创 但这位大师深入浅出的讲解了小波变换 是你在学习小波的过程中 必看之作 小波变换和 motion 信号处理 系列共包含三篇 nbsp nbsp 第一篇 基础普及 小波变换完美通俗解读 nbsp nbsp 第二篇 深入小波 nbsp nbsp 第三篇 小波应用限于篇幅关系

    2026年3月19日
    2
  • java最新手机号正则校验[通俗易懂]

    java最新手机号正则校验[通俗易懂]手机号校验publicstaticbooleanCheckMobilePhoneNum(StringphoneNum){ Stringregex=”^(1[3-9]\\d{9}$)”;if(phoneNum.length()!=11){returnfalse;}else{Patternp=Pattern…

    2022年5月23日
    91

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号