美文网首页
java CA证书制作和代码中使用

java CA证书制作和代码中使用

作者: 好多个胖子 | 来源:发表于2018-07-03 16:04 被阅读1291次

    [TOC]

    操作环境 window10 cmd

    证书制作

    xxx.keystore是秘钥库,存储了公钥和私钥信息,一个秘钥库可以存储多对的密钥对(密钥对可以理解为就是证书),通过alias别名来取出需要的密钥对。xxx.cer证书只能存储公钥,可以从xxxx.keystore中导出某个密钥对的公钥证书。

    生成keystore

    //创建一个秘钥库名为,lu.keystore 同时创建一对密钥对,别名是lisi   存入该秘钥库
    PS F:\test\keystore> keytool -genkeypair -alias lisi -keystore lu.keystore -keyalg RSA
    输入密钥库口令:
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  li
    您的组织单位名称是什么?
      [Unknown]:  li
    您的组织名称是什么?
      [Unknown]:  li
    您所在的城市或区域名称是什么?
      [Unknown]:  li
    您所在的省/市/自治区名称是什么?
      [Unknown]:  li
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  CN
    CN=li, OU=li, O=li, L=li, ST=li, C=CN是否正确?
      [否]:  y
    
    输入 <lisi> 的密钥口令
            (如果和密钥库口令相同, 按回车):
    PS F:\test\keystore> ls
    
    
        目录: F:\test\keystore
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----         2018/7/3     15:07           2181 lu.keystore
            
    //可用命令参数        
            
    # -keyalg  指的是加密算法  证书的加密算法一般是DSA/RSA/EC,一般我们使用的都是RSA
    # -alias   别名
    # -validity指定有效期,单位为天,
    # -keystore  指定秘钥库名称,不指定默认生成.keystore
    # -keysize 秘钥大小  一般是1024和2048
    # -storepass 证书库的使用密码,从里面提取公钥时需要密码
    # -dname :CN拥有者名字,可以是跟网站相关的信息,如www.baidu.com,OU组织机构名 O组织名 L城市 ST州或省 C国家代码      
    

    命令执行成功后,会在当前目录生成lu.keystore文件

    查看秘钥库信息

    PS F:\test\keystore> keytool -list -keystore lu.keystore -v
    输入密钥库口令:
    
    密钥库类型: JKS
    密钥库提供方: SUN
    
    您的密钥库包含 1 个条目
    
    别名: lisi
    创建日期: 2018-7-3
    条目类型: PrivateKeyEntry
    证书链长度: 1
    证书[1]:
    所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    发布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    序列号: 38621ae3
    有效期开始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
    证书指纹:
             MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
             SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
             SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
             签名算法名称: SHA256withRSA
             版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
    0010: B4 59 59 EA                                        .YY.
    ]
    ]
    
    
    
    *******************************************
    *******************************************
    

    可以看到此时我们的秘钥库库类型是JKS,里有一个密钥对

    导出公钥证书

    PS F:\test\keystore> keytool -exportcert -alias lisi -keystore lu.keystore -file lisi.cer
    输入密钥库口令:
    存储在文件 <lisi.cer> 中的证书
    PS F:\test\keystore> ls
    
    
        目录: F:\test\keystore
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----         2018/7/3     15:16            831 lisi.cer
    -a----         2018/7/3     15:07           2181 lu.keystore
    

    将别名为lisi的密钥对公钥信息导出到lisi.cer,这便是我们看到的xxx.cer证书了,这个证书可以发布给任何人用于加密信息,而能够解密的秘钥保存在我们创建的lu.keystore中别名为lisi的证书中

    使用一个证书给另一个证书签名

    前面我们生成了一个别名为lisi的证书,存储在lu.keystore中,接下来再生成一个名为张三的证书,也存储到lu.keystore

    //步骤同创建lisi一样
    PS F:\test\keystore> keytool -genkeypair -alias zhangsan -keyalg RSA -keystore lu.keystore
    xxxx
    xxxx
    
    //查看此时的秘钥库
    PS F:\test\keystore> keytool -list -keystore lu.keystore -v
    输入密钥库口令:
    
    密钥库类型: JKS
    密钥库提供方: SUN
    
    您的密钥库包含 2 个条目
    
    别名: zhangsan
    创建日期: 2018-7-3
    条目类型: PrivateKeyEntry
    证书链长度: 1
    证书[1]:
    所有者: CN=zh, OU=zh, O=zh, L=zh, ST=zh, C=CN
    发布者: CN=zh, OU=zh, O=zh, L=zh, ST=zh, C=CN
    序列号: 2684e96b
    有效期开始日期: Tue Jul 03 15:24:00 CST 2018, 截止日期: Mon Oct 01 15:24:00 CST 2018
    证书指纹:
             MD5: 8D:EA:0F:F7:E9:9E:41:34:CD:97:0C:C7:29:B5:8D:3F
             SHA1: DF:C7:03:D1:8E:BA:9F:E7:DA:FA:07:2E:57:FC:DB:7F:70:BB:FE:2B
             SHA256: 19:A2:F2:AB:EF:A8:91:89:79:F2:70:17:AA:B5:AD:04:84:3B:D4:49:40:14:C3:C9:AC:20:16:CA:44:95:C7:B9
             签名算法名称: SHA256withRSA
             版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: 4E 24 A9 98 60 E1 7F 46   FC CF 29 1A D3 AE D5 52  N$..`..F..)....R
    0010: D2 B3 B5 31                                        ...1
    ]
    ]
    
    
    
    *******************************************
    *******************************************
    
    
    别名: lisi
    创建日期: 2018-7-3
    条目类型: PrivateKeyEntry
    证书链长度: 1
    证书[1]:
    所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    发布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    序列号: 38621ae3
    有效期开始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
    证书指纹:
             MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
             SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
             SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
             签名算法名称: SHA256withRSA
             版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
    0010: B4 59 59 EA                                        .YY.
    ]
    ]
    
    
    
    *******************************************
    *******************************************
    
    

    可以看到此时秘钥库里面已经有两个条目了(两个证书)我们接下来用lisi证书给张三证书签名(即认证过程)

    //创建一个certreq 信息存储在zhangsan.csr
    PS F:\test\keystore> keytool -certreq -alias zhangsan -keystore lu.keystore -file zhangsan.csr
    输入密钥库口令:
    PS F:\test\keystore> ls
    
    
        目录: F:\test\keystore
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----         2018/7/3     15:16            831 lisi.cer
    -a----         2018/7/3     15:24           4334 lu.keystore
    -a----         2018/7/3     15:28           1058 zhangsan.csr
    
    //使用创建的zhangsan.csr向lisi发起认证,最终生成需要的证书zhangsan.cer
    PS F:\test\keystore> keytool -gencert -alias lisi -keystore lu.keystore -infile zhangsan.csr -outfile zhangsan.cer
    输入密钥库口令:
    PS F:\test\keystore> ls
    
    
        目录: F:\test\keystore
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----         2018/7/3     15:16            831 lisi.cer
    -a----         2018/7/3     15:24           4334 lu.keystore
    -a----         2018/7/3     15:29            864 zhangsan.cer
    -a----         2018/7/3     15:28           1058 zhangsan.csr
    
    //将被认证过的证书zhangsan.cer导入到zhangsan证书中,完成认证
    PS F:\test\keystore> keytool -importcert -alias zhangsan -keystore lu.keystore -file zhangsan.cer
    输入密钥库口令:
    证书回复已安装在密钥库中
    

    上面三步骤完成后,证书zhangsan就已经被证书lisi认证,再查看秘钥库的信息:

    PS F:\test\keystore> keytool -list -keystore lu.keystore -v
    输入密钥库口令:
    
    密钥库类型: JKS
    密钥库提供方: SUN
    
    您的密钥库包含 2 个条目
    
    别名: zhangsan
    创建日期: 2018-7-3
    条目类型: PrivateKeyEntry
    证书链长度: 2
    证书[1]:
    所有者: CN=zh, OU=zh, O=zh, L=zh, ST=zh, C=CN
    发布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    序列号: e3abce9
    有效期开始日期: Tue Jul 03 15:29:10 CST 2018, 截止日期: Mon Oct 01 15:29:10 CST 2018
    证书指纹:
             MD5: 17:BE:4C:2A:91:67:DB:07:83:2C:37:AA:E0:BB:22:AA
             SHA1: A9:67:85:5D:8E:47:F2:A9:D3:08:69:28:66:32:5B:25:FF:38:56:C4
             SHA256: CC:7D:18:11:D0:F8:F8:2F:83:64:32:45:DD:18:D6:C4:54:AF:3C:6F:16:10:A7:C4:BF:81:4C:3F:7D:12:45:49
             签名算法名称: SHA256withRSA
             版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.35 Criticality=false
    AuthorityKeyIdentifier [
    KeyIdentifier [
    0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
    0010: B4 59 59 EA                                        .YY.
    ]
    ]
    
    #2: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: 4E 24 A9 98 60 E1 7F 46   FC CF 29 1A D3 AE D5 52  N$..`..F..)....R
    0010: D2 B3 B5 31                                        ...1
    ]
    ]
    
    证书[2]:
    所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    发布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    序列号: 38621ae3
    有效期开始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
    证书指纹:
             MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
             SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
             SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
             签名算法名称: SHA256withRSA
             版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
    0010: B4 59 59 EA                                        .YY.
    ]
    ]
    
    
    
    *******************************************
    *******************************************
    
    
    别名: lisi
    创建日期: 2018-7-3
    条目类型: PrivateKeyEntry
    证书链长度: 1
    证书[1]:
    所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    发布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
    序列号: 38621ae3
    有效期开始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
    证书指纹:
             MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
             SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
             SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
             签名算法名称: SHA256withRSA
             版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
    0010: B4 59 59 EA                                        .YY.
    ]
    ]
    
    
    
    *******************************************
    *******************************************
    

    注意观察条目zhangsan证书的发布者已经变成了lisi的信息了,并且多了一个证书[2]:,这个就是颁发者的信息

    证书加密和解密操作代码实现

    @org.junit.Test
    public void testCertificate() throws Exception {
        final String alias = "lisi";
        final String keystore_password = "123456";//秘钥库密码
        final String ca_password = "123456";//证书密码
        
        
        //公钥证书的编码格式是x509  私钥通常是pkcs8
        /*从lisi.cer中提取公钥*/
        X509Certificate x509Certificate = null;
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        FileInputStream fis = new FileInputStream("F://test/keystore/lisi.cer");
        x509Certificate = (X509Certificate) certificateFactory.generateCertificate(fis);
        fis.close();
        
        /*==========使用公钥加密============*/
        Key key = x509Certificate.getPublicKey();
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] bytes = cipher.doFinal("helloworld".getBytes());
        System.out.println("加密结果: " + Base64.getEncoder().encodeToString(bytes));
    
    
        /*提取秘钥*/
        fis = new FileInputStream("F://test/keystore/lu.keystore");
        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(fis, keystore_password.toCharArray());
        fis.close();
    
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, ca_password.toCharArray());
    
        /*=======使用私钥解密=========*/
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        bytes = cipher.doFinal(bytes);
        System.out.println("解密: " + new String(bytes));
    }
    

    相关文章

      网友评论

          本文标题:java CA证书制作和代码中使用

          本文链接:https://www.haomeiwen.com/subject/uocjuftx.html