Java keytool keystore的相关概念介绍与使用

参考资料

  1. Java证书工具keytool用法总结
  2. keytool-简介
  3. CA证书介绍与格式转换
  4. 密钥,私钥,公钥的区分
  5. とほほのOpenSSL入門

目录

  • [一. 概念](#一. 概念)
    • [1.1 keystore文件](#1.1 keystore文件)
    • [1.2 keytool](#1.2 keytool)
    • [1.3 非对称加密](#1.3 非对称加密)
      • [1.3.1 加密解密](#1.3.1 加密解密)
      • [1.3.2 数字签名认证](#1.3.2 数字签名认证)
      • [1.3.3 通信中的加密与签名过程](#1.3.3 通信中的加密与签名过程)
    • [1.4 证书格式](#1.4 证书格式)
    • [1.5 openssl](#1.5 openssl)
    • [1.6 X.509标准](#1.6 X.509标准)
  • [二. keytool工具使用](#二. keytool工具使用)
    • [2.1 生成](#2.1 生成)
      • [2.1.1 生成keystore文件](#2.1.1 生成keystore文件)
      • [2.1.2 指定私钥生成公钥](#2.1.2 指定私钥生成公钥)
    • [2.2 查看](#2.2 查看)
      • [2.2.1 查看所有密钥与keystore的类型](#2.2.1 查看所有密钥与keystore的类型)
      • [2.2.2 查看keystore内的指定密钥的详情](#2.2.2 查看keystore内的指定密钥的详情)
    • [2.3 修改](#2.3 修改)
      • [2.3.1 修改指定的密钥别名](#2.3.1 修改指定的密钥别名)
      • [2.3.2 修改指定密钥的密码](#2.3.2 修改指定密钥的密码)
      • [2.3.3 修改keysore密码](#2.3.3 修改keysore密码)
    • [2.4 删除](#2.4 删除)
    • [2.5 密钥导入keystore](#2.5 密钥导入keystore)

一. 概念

1.1 keystore文件

keystore文件可以理解为一个容器,用来存储公钥和私钥,主要用于确保身份验证、数据加密和数字签名的安全。

⏹文件类型

  • JKS (Java KeyStore)
    • Java8之前默认的 keystore 类型,专门用于 Java 应用程序。
  • PKCS12
    • 国际标准的 keystore 格式
    • 存储加密的私钥和证书的标准化方式
    • 兼容性好,与编程语言无关,适用于各种平台和工具。

💥注意

keystore文件只是一个容器,里面可以内置多个公钥和私钥。

1.2 keytool

keytool 是JDK 1.4以后自带的密钥和证书管理工具,主要用于生成密钥对、创建、管理、导入和导出证书等。

  • Java8之前,通过keytool命令生成的keystore文件的默认类型就是JKS
  • Java9之后的版本将 PKCS12 作为默认的 keystore 类型。

⏹该工具的路径为%JAVA_HOME%\bin\keytool.exe,Java配置了环境变量之后,便可在命令行中使用。

1.3 非对称加密

⏹使用一对密钥(公钥和私钥),来进行数据加密和解密。

核心特性:

  • 公钥和私钥是成对的,公钥用于加密,私钥用于解密
  • 可以通过私钥生成公钥,但是无法通过公钥生成私钥。
  • 私钥必须保密,而公钥可以公开发布。

1.3.1 加密解密

  • 发送方使用接收方的公钥加密数据。
  • 加密后的数据通过网络传输给接收方
  • 接收方使用自己的私钥解密数据,恢复明文。

1.3.2 数字签名认证

  • 使用私钥加密摘要(生成签名),意味着只有拥有私钥的人(即签名者)才能创建这个签名,从而确认签名的真实性。
  • 任何人持有发送方的公钥都可以验证签名(通过解密签名获得摘要并与数据摘要比较),但只有私钥持有者才能生成签名,这确保了签名的唯一性和数据的来源可信。

1.3.3 通信中的加密与签名过程

假设 A 要与 B 进行安全通信,通常会按以下步骤操作:

A 加密数据的过程

⏹签名数据(完整性和身份认证):

  • A 使用自己的私钥对数据的哈希摘要进行加密,生成数字签名。
  • 然后,A 将签名和数据一起发送给 B,以便 B 可以验证数据的真实性和来源。

⏹加密数据(机密性):

  • A 使用B的公钥对数据进行加密(有时包括签名部分一起加密),确保数据在传输过程中保持机密。
  • 加密后的数据发送给 B,只有 B 的私钥可以解密。

B 接收数据后的验证过程

⏹解密数据:

  • B使用自己的私钥解密收到的数据,得到原始数据和签名。

⏹验证签名:

  • B 使用A的公钥解密签名,得到 A 生成的哈希摘要。
  • B 对解密得到的数据再次生成哈希摘要,并与 A 提供的摘要进行比较。
  • 如果两者一致,B 可以确认数据未被篡改,并且确认数据确实来自 A。

1.4 证书格式

⏹我们常说的证书其实指的就是公钥,公钥是公开给其它人使用的,常见的后缀有以下几种:

  • .crt
    • crt后缀的证书常用于Unix/Linux系统中。
    • 证书是PEM格式(文本编码格式),通常使用Base64编码,可以直接以文本编辑器查看。
  • .cer
    • cer后缀的证书常用于Windows系统,兼容Windows 的证书管理器。
    • 证书是DER格式(二进制编码格式),无法以文本形式查看,需要专门的证书工具查看。
  • .pem
    • pem(Privacy Enhanced Mail)格式的证书是一种基于 Base64 编码的可读文本格式。
    • pem格式的文件使用明确的分隔符,标明数据类型
      • -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----:表示证书数据
      • -----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY-----:表示私钥数据
      • -----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY-----:表示公钥数据

1.5 openssl

OpenSSL 是一个广泛使用的开源工具集,提供了实现安全套接字层(SSL)和传输层安全(TLS)协议所需的各种功能。

也支持加密、解密、证书生成和管理等功能。

⏹可以使用openssl对证书的格式进行转换。

  • .cer 转换为 .pem
  • .pem 转换为 .cer

⏹官网:https://www.openssl.org/

1.6 X.509标准

用于定义数字证书的格式和证书验证机制,是公钥基础设施(PKI)的核心部分。

主要用于在计算机网络中验证身份,并在安全通信中提供数字证书。

⏹数字证书格式:

  • X.509 定义了数字证书的结构,包括证书的各个部分,如持有者信息、公钥、颁发者信息和有效期等。
  • 证书通常包括以下字段:
    • 版本:指示 X.509 证书的版本(如 V1、V2、V3)。
    • 序列号:由证书颁发机构(CA)分配的唯一标识符。
    • 颁发者:证书颁发机构的名称和信息。
    • 主题:持有者的名称和信息。
    • 公钥信息:持有者的公钥及其算法。
    • 有效期:证书的有效起始时间和结束时间。
    • 签名:由 CA 使用其私钥生成的证书签名。

⏹公钥基础设施(PKI):

  • X.509 是公钥基础设施的重要组成部分,它使得通过数字证书来验证公钥的合法性成为可能。
  • PKI 包括 CA、证书撤销列表(CRL)、注册机构(RA)等组件,支持数字证书的管理和验证。

⏹证书链:

  • X.509 证书可以形成证书链,信任链中每个证书都是由上级 CA 签名的,最终链接到一个根证书。
  • 通过验证证书链中的每个证书,可以确认目标证书的有效性。

⏹下图是由X.509标准生成的.cer后缀DER格式的公钥证书


二. keytool工具使用

💥以下所涉及的所有命令,为了方便显示都采取了折行显示,实际使用时,建议转换为一行使用。

⏹要了解某个命令的参数可以使用keytool -command_name -help来获取。

例如:使用keytool -genkeypair -help可以查看genkeypair命令

2.1 生成

2.1.1 生成keystore文件

⏹生成的keystore文件内含一对密钥(公钥和私钥)

powershell 复制代码
keytool -genkeypair 
		-alias <密钥别名> 
		-keyalg RSA 
		-sigalg SHA384withRSA 
		-keysize 2048 
		-validity 365 
		-keystore <keystore文件所在路径>
		-storepass <keystore密码>

# 问题组1
您的名字与姓氏是什么?
您的组织单位名称是什么?
您的组织名称是什么?
您所在的城市或区域名称是什么?
您所在的省/市/自治区名称是什么?
该单位的双字母国家/地区代码是什么?

# 问题组2
私钥的密码

2.1.2 指定私钥生成公钥

⏹根据keystore中的指定私钥,生成cer格式的公钥

powershell 复制代码
keytool -exportcert 
		-alias <密钥别名>
		-keystore <keystore文件所在路径>
		-storepass <keystore密码>
		-file <cer文件所在路径>

⏹通过openssl将cer格式的公钥转换为pem格式的公钥

powershell 复制代码
openssl x509 
		-inform der
		-in clientkey.cer
		-outform pem
		-out clientkey.pem

2.2 查看

2.2.1 查看所有密钥与keystore的类型

  • 可以看到一个keystore内所有的公钥和私钥
  • 可以查看keystore的类型,到底是 JKS 还是 PKCS12
powershell 复制代码
keytool -list 
		-keystore <keystore文件所在路径> 
		-storepass <keystore密码>

2.2.2 查看keystore内的指定密钥的详情

powershell 复制代码
keytool -list -v 
		-alias <密钥别名> 
		-keystore <keystore文件所在路径> 
		-storepass <keystore密码>

2.3 修改

2.3.1 修改指定的密钥别名

powershell 复制代码
keytool -changealias 
		-keystore <keystore文件所在路径> 
		-alias <旧别名> 
		-destalias <新别名>

2.3.2 修改指定密钥的密码

powershell 复制代码
keytool -keypasswd 
		-alias <密钥别名> 
		-keypass <旧密钥密码> 
		-new <新密钥密码> 
		-keystore <keystore文件所在路径> 
		-storepass <keystore密码>

2.3.3 修改keysore密码

powershell 复制代码
keytool -storepasswd 
		-new <新keystore密码> 
		-keystore <keystore文件所在路径> 
		-storepass <原keystore密码>

2.4 删除

⏹删除keystore里面的指定密钥

powershell 复制代码
keytool -delete 
		-alias <密钥别名> 
		-keystore <keystore文件所在路径> 
		-storepass <keystore密码>

2.5 密钥导入keystore

⏹将B的keystore中的私钥导入到A的keystore中

powershell 复制代码
keytool -importkeystore
		-srckeystore <B.keystore>
		-srcstoretype JKS或者PKCS12
		-srcalias <B.keystore中的既存私钥别名>
		-destkeystore <A.keystore>
		-deststoretype JKS或者PKCS12
		-destalias <A.keystore中的待导入私钥别名>
相关推荐
WaaTong2 分钟前
Java反射
java·开发语言·反射
九圣残炎35 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge37 分钟前
Netty篇(入门编程)
java·linux·服务器
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself2 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq04152 小时前
J2EE平台
java·java-ee