关于 Java Keytool 的基本介绍可以参考: Java Keytool 命令行工具
本篇主要解决如下问题:
-genkeypair
命令产生的究竟是什么呢?-genkey
和-genkeypair
的关系是怎样的呢?-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
-alias
选项的默认值就是mykey , 所以这个参数如果忽略,别名默认就是mykey上面的命令产生了一对密钥同时也产生了使用X.509 v3 自签名的证书, 如何查看证书的内容呢?方式有多种, 最简单的就是使用-list
命令, 也可以使用Java代码获取。
使用 -list
查看证书库中的条目的命令如下:
keytool -list -rfc -keystore my.keystore -storepass 111111
从上图可以看出, 这个证书库文件包含一个条目,条目的类似是 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。
.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); } } }
该代码运行的效果如下: