zoukankan      html  css  js  c++  java
  • 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】加密信息语法标准

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

    CMS

    .p7c/.p7m/.p7s

    Cryptographic Message Syntax

    1p7c只保存证书
    2
    p7msignature 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实现版本,providerSUN

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

    JCEKS

    .jce

    JCE Keystore】密钥库的JCE实现版本,providerSUN JCE

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

    时采用TripleDES

    PKCS12

    .p12/.pfx

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

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

    BKS

    .bks

    Bouncycastle Keystore】密钥库的BC实现版本,providerBC

    基于JCE实现

    UBER

    .ubr

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

     


    三。使用java的keytool生成证书

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

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

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

     keytool /?查看所有的子命令

    C:Usersjiaozi>keytool
    密钥和证书管理工具
    
    命令:
    
     -certreq            生成证书请求
     -changealias        更改条目的别名
     -delete             删除条目
     -exportcert         导出证书
     -genkeypair         生成密钥对
     -genseckey          生成密钥
     -gencert            根据证书请求生成证书
     -importcert         导入证书或证书链
     -importkeystore     从其他密钥库导入一个或所有条目
     -keypasswd          更改条目的密钥口令
     -list               列出密钥库中的条目
     -printcert          打印证书内容
     -printcertreq       打印证书请求的内容
     -printcrl           打印 CRL 文件的内容
     -storepasswd        更改密钥库的存储口令
       keytool -genkeypair /?查看genkeypair的子命令  

    C:Usersjiaozi>keytool -genkeypair /?
    非法选项:  a
    keytool -genkeypair [OPTION]...
    生成密钥对
    选项:
     -alias <alias>                  要处理的条目的别名
     -keyalg <keyalg>                密钥算法名称
     -keysize <keysize>              密钥位大小
     -sigalg <sigalg>                签名算法名称
     -destalias <destalias>          目标别名
     -dname <dname>                  唯一判别名
     -startdate <startdate>          证书有效期开始日期/时间
     -ext <value>                    X.509 扩展
     -validity <valDays>             有效天数
     -keypass <arg>                  密钥口令
     -keystore <keystore>            密钥库名称
     -storepass <arg>                密钥库口令
     -storetype <storetype>          密钥库类型
     -providername <providername>    提供方名称
     -providerclass <providerclass>  提供方类名
     -providerarg <arg>              提供方参数
     -providerpath <pathlist>        提供方类路径
     -v                              详细输出
     -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

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

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

    C:Usersjiaozi>keytool  -exportcert -alias test -file c:/a.cer -keystore c:/a.k
    eystore -storepass 123456
    存储在文件 <c:/a.cer> 中的证书

    》》添加证书到秘钥库中

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

    》》数据证书签发申请 csr

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

    C:Usersjiaozi>keytool -genkeypair -keystore c:/root.keystopre
    输入密钥库口令:
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  jiaozi
    您的组织单位名称是什么?
      [Unknown]:  yt
    您的组织名称是什么?
      [Unknown]:  ytgroup
    您所在的城市或区域名称是什么?
      [Unknown]:  zh_CN
    您所在的省/市/自治区名称是什么?
      [Unknown]:  gd
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  china
    CN=jiaozi, OU=yt, O=ytgroup, L=zh_CN, ST=gd, C=china是否正确?
      [否]:  y
    
    输入 <mykey> 的密钥口令
            (如果和密钥库口令相同, 按回车):
    
    C:Usersjiaozi>keytool -list -keystore c:/root.keystopre
    输入密钥库口令:
    
    密钥库类型: JKS
    密钥库提供方: SUN
    
    您的密钥库包含 1 个条目
    
    mykey, 2017-7-24, PrivateKeyEntry,
    证书指纹 (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: oot.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: ootca.cer

    设置如下:

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

    导入成功后可以看到

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

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

      -signedjar ref1.jar  可以指定生成一个新的jar包
      

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


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

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

    使用命令查看秘钥库

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



     






  • 相关阅读:
    css background详解
    Javascript DOM 编程艺术:ENHANCING CONTENT
    Javascript DOM 编程艺术:创建一个简单的gallery
    js prototype
    Javascript DOM 编程艺术:优雅降级
    php solutions:创建画廊
    Javascript DOM 编程艺术: popUp
    Javascript DOM 编程艺术:Creating Markup on the Fly
    转:Node和Element的区别
    javascript语言精粹:函数
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331204.html
Copyright © 2011-2022 走看看