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中的待导入私钥别名>
相关推荐
不会玩技术的技术girl1 小时前
使用Java爬虫获取京东商品评论API接口(JD.item_review)数据
java·开发语言·爬虫
计算机毕设指导62 小时前
基于Spring Boot的医院挂号就诊系统【免费送】
java·服务器·开发语言·spring boot·后端·spring·maven
Yolowuwu2 小时前
算法跟练第十一弹——二叉树
java·算法·leetcode
m0_748238922 小时前
Java面试题--设计模式
java·开发语言·设计模式
青云交2 小时前
Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)
java·大数据·区块链·智能合约·共识机制·数据可信·价值流转
汇匠源3 小时前
如何开发一个基于Java的商城小程序?
java·小程序
115432031q3 小时前
基于SpringBoot养老院平台系统功能实现十七
java·前端·后端
众智创新团队3 小时前
Android的Activity生命周期知识点总结,详情
android·java·开发语言
&岁月不待人&3 小时前
Android 常用设计模式和实例
java·开发语言·设计模式
qq_13948428823 小时前
springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)
java·数据库·spring boot·后端·spring·maven·intellij-idea