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中的待导入私钥别名>
相关推荐
LiuYaoheng13 小时前
【Android】View 的基础知识
android·java·笔记·学习
勇往直前plus13 小时前
Sentinel微服务保护
java·spring boot·微服务·sentinel
星辰大海的精灵13 小时前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
小鸡脚来咯13 小时前
一个Java的main方法在JVM中的执行流程
java·开发语言·jvm
江团1io013 小时前
深入解析三色标记算法
java·开发语言·jvm
天天摸鱼的java工程师13 小时前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
你我约定有三13 小时前
java--泛型
java·开发语言·windows
杨杨杨大侠13 小时前
第3章:实现基础事件总线
java·github·eventbus
杨杨杨大侠13 小时前
第4章:添加注解支持
java·github·eventbus
咖啡Beans13 小时前
异步处理是企业开发的‘生存之道’!Java8和Spring的异步实现,你必须搞清楚!
java·后端