java keytool 深入理解

2022/3/19 11:29:44

本文主要是介绍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);
			}
		}
	}

该代码运行的效果如下:

在这里插入图片描述



这篇关于java keytool 深入理解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程