关于 Java Keytool 的基本介绍可以参考: Java Keytool 命令行工具
本篇主要解决如下问题:
-genkeypair 命令产生的究竟是什么呢?-genkey 和-genkeypair 的关系是怎样的呢?- 使用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
从上图可以看出, 这个证书库文件包含一个条目,条目的类似是 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);
}
}
}
该代码运行的效果如下:
|