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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: java CA证书制作和代码中使用

Keytool 是一个Java 数据证书的管理工具 ,Keytool 将密钥(key)和证书(certificates)存在一个称为keystore的文件中 在keystore里,包含两种数据:  

密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)  

可信任的证书实体(trusted certificate entries)——只包含公钥

ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写

操作环境 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));
}


目录
相关文章
|
14天前
|
Kubernetes jenkins 持续交付
从代码到k8s部署应有尽有系列-java源码之String详解
本文详细介绍了一个基于 `gitlab + jenkins + harbor + k8s` 的自动化部署环境搭建流程。其中,`gitlab` 用于代码托管和 CI,`jenkins` 负责 CD 发布,`harbor` 作为镜像仓库,而 `k8s` 则用于运行服务。文章具体介绍了每项工具的部署步骤,并提供了详细的配置信息和示例代码。此外,还特别指出中间件(如 MySQL、Redis 等)应部署在 K8s 之外,以确保服务稳定性和独立性。通过本文,读者可以学习如何在本地环境中搭建一套完整的自动化部署系统。
43 0
|
1天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
15 6
|
7天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
33 11
|
5天前
|
并行计算 Java 开发者
探索Java中的Lambda表达式:简化代码,提升效率
Lambda表达式在Java 8中引入,旨在简化集合操作和并行计算。本文将通过浅显易懂的语言,带你了解Lambda表达式的基本概念、语法结构,并通过实例展示如何在Java项目中应用Lambda表达式来优化代码,提高开发效率。我们将一起探讨这一现代编程工具如何改变我们的Java编码方式,并思考它对程序设计哲学的影响。
|
5天前
|
安全 Java 测试技术
掌握Java的并发编程:解锁高效代码的秘密
在Java的世界里,并发编程就像是一场精妙的舞蹈,需要精准的步伐和和谐的节奏。本文将带你走进Java并发的世界,从基础概念到高级技巧,一步步揭示如何编写高效、稳定的并发代码。让我们一起探索线程池的奥秘、同步机制的智慧,以及避免常见陷阱的策略。
|
15天前
|
Java Devops 持续交付
探索Java中的Lambda表达式:简化代码,提升效率DevOps实践:持续集成与部署的自动化之路
【8月更文挑战第30天】本文深入探讨了Java 8中引入的Lambda表达式如何改变了我们编写和管理代码的方式。通过简化代码结构,提高开发效率,Lambda表达式已成为现代Java开发不可或缺的一部分。文章将通过实际例子展示Lambda表达式的强大功能和优雅用法。
|
15天前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
25 5
|
12天前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
11 1
|
15天前
|
Java
java代码和详细的代码应用
代码块分为局部、构造、静态和同步代码块。局部代码块控制变量生命周期,例如 `int a` 只在特定代码块内有效。构造代码块用于创建对象时执行附加功能,避免构造方法中代码重复。静态代码块随类加载执行一次,常用于初始化操作。同步代码块确保多线程环境下方法执行的原子性,通过 `synchronized` 关键字实现。
23 3
|
14天前
|
Java
Java中的Lambda表达式:简化代码,提升效率
【8月更文挑战第31天】Lambda表达式在Java 8中引入,旨在使代码更加简洁和易读。本文将探讨Lambda表达式的基本概念、使用场景及如何通过Lambda表达式优化Java代码。我们将通过实际示例来展示Lambda表达式的用法和优势,帮助读者更好地理解和应用这一特性。