IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> java keytool 深入理解 -> 正文阅读

[网络协议]java keytool 深入理解

关于 Java Keytool 的基本介绍可以参考: Java Keytool 命令行工具

本篇主要解决如下问题:

  1. -genkeypair 命令产生的究竟是什么呢?
  2. -genkey-genkeypair 的关系是怎样的呢?
  3. 使用Java代码如何获取keystore文件的内容呢?

-genkeypair 命令产生的究竟是什么呢?

下面使用-genkeypair产生密钥对到文件my.keystore 中。
keytool -genkeypair -alias mykey -keyalg RSA -keypass 111111 -keystore my.keystore -storepass 111111 -dname "CN=myname,OU=mydept,O=mycompany,L=HF,ST=AH,C=CN"
-genkeypair 产生在证书库文件中的内容叫做“条目”,这个条目不仅仅是密钥对。一个库文件可以包含多个条目。
上面的命令产生的证书库文件名是: my.keystore

  • 条目的别名是 mykey, -alias 选项的默认值就是mykey , 所以这个参数如果忽略,别名默认就是mykey
  • 条目管理的密码和证书库管理的密码都是 111111
  • 密钥的算法是RSA

上面的命令产生了一对密钥同时也产生了使用X.509 v3 自签名的证书, 如何查看证书的内容呢?方式有多种, 最简单的就是使用-list命令, 也可以使用Java代码获取。
使用 -list 查看证书库中的条目的命令如下:
keytool -list -rfc -keystore my.keystore -storepass 111111

  • -rfc ,将以可打印的编码格式输出证书

在这里插入图片描述

从上图可以看出, 这个证书库文件包含一个条目,条目的类似是 PrivateKeyEntry, 证书链长度是1 , 有一个证书。

从上面的截图可以看到私钥和证书,公钥要如何查看呢? 结合openssl 可以查看公钥。关于OpenSSL,可以参考 SSL/TLS 工具 OpenSSL。在命令行输入如下命令:
keytool -list -rfc -keystore my.keystore -storepass 111111 -alias mykey | openssl x509 -inform pem -pubkey, 显示的效果如下:
在这里插入图片描述

-genkey-genkeypair 的关系是怎样的呢?

这两个都是产生密钥对,公钥和私钥。
在Java 1.6之前使用的是 genkey, 之后改名为genkeypair , 但是genkey也可以继续使用。
网络上很多文章说genkey只产生私钥的说法是错误的,只产生密钥(也就是私钥使用)使用genkey。

使用Java代码如何获取keystore文件的内容呢?

.keystore 是二进制文件,使用文本编辑器无法查看,Java提供了相关的类可以从二进制库文件中获取条目相关的信息, 包括私钥和公钥等:

@Test
	public void readKeyStore() throws Exception {
		String keyStoreFilePath = "D:\\xxx\\my.keystore"; \\证书库的路径
		String keyStorePass = "111111";
		String keyPass = "111111";
		FileInputStream fis = new FileInputStream(new File(keyStoreFilePath));
		KeyStore keystore = KeyStore.getInstance("JKS");
		keystore.load(fis, keyStorePass.toCharArray());

		// 遍历密钥库中的条目
		Enumeration<String> aliaes = keystore.aliases();
		while (aliaes.hasMoreElements()) {
			String alias = aliaes.nextElement();
			// 私钥
			Key key = keystore.getKey(alias, keyPass.toCharArray());
			System.out.println("私钥:");
			System.out.println(Base64.getEncoder().encodeToString(key.getEncoded()));

			// 证书: 包含公钥
			Certificate[] certs = keystore.getCertificateChain(alias);
			for (Certificate cert : certs) {
				PublicKey puk = cert.getPublicKey();
				System.out.println("公钥:");
				System.out.println(puk);
			}
		}
	}

该代码运行的效果如下:

在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:30:49  更:2022-03-21 21:32:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:21:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码