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

一 。证书类型

   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】加密信息语法标准

1、p7b以树状展示证书链,不含私钥
2、p7r为CA对证书请求签名的回复,只能用于导入

CMS

.p7c/.p7m/.p7s

【Cryptographic Message Syntax】

1、p7c只保存证书
2、p7m:signature with enveloped data
3、p7s:时间戳签名文件

PEM

.pem

【Printable Encoded Message】

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

【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理
2、ASCII文件
3、一般基于base 64编码

PKCS10

.p10/.csr

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

1、证书签名请求文件
2、ASCII文件
3、CA签名后以p7r文件回复

SPC

.pvk/.spc

【Software Publishing Certificate】

微软公司特有的双证书文件格式,经常用于代码签名,其中
1、pvk用于保存私钥
2、spc用于保存公钥

 

 

二。密钥库类型

    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】个人信息交换语法标准

1、包含私钥、公钥及其证书
2、密钥库和私钥用相同密码进行保护

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 123456

  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 123456

  3. 存储在文件 中的证书

》》添加证书到秘钥库中

 

 
  1. C:\Users\jiaozi>keytool -importcert -alias test2 -file c:/a.cer -keystore c:/a.

  2. keystore -storepass 123456

  3. 在别名 之下, 证书已经存在于密钥库中

  4. 是否仍要添加? [否]: y

  5. 证书已添加到密钥库中

  6.  
  7. C:\Users\jiaozi>keytool -list -keystore c:/a.keystore -storepass 123456

  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证书签名 生成新的证书

   keytool -gencert -alias mykey -keystore c:\root.keystore -infile c:\my.csr -outfil
e c:\my.cer

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

    

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

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

导出root.keystore中的根证书 

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

设置如下:

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

导入成功后可以看到

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

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

  -signedjar ref1.jar  可以指定生成一个新的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, "123456".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, "123456".toCharArray(),new Certificate[]{ mycert});

  26. keyStore.store(new FileOutputStream("c:/ttt.keystore"), "123456".toCharArray());

  27. }

使用命令查看秘钥库

 

 
  1. C:\Users\jiaozi>keytool -list -keystore c:/ttt.keystore -storepass 123456 -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

 

你可能感兴趣的:(安全)