1. 概述
在这个教程中,我们将学习如何使用 Java Keystore API 和 keytool
工具来检查 Java keystore 文件中的证书名称和别名。
2. 准备
在描述两种方法之前,我们先用 keytool
工具创建一个 keystore 文件:
$ keytool -genkeypair -keyalg rsa -alias baeldung -storepass storepw@1 -keystore my-keystore.jks
注意,keystore 密码中包含 '*$'
可能会导致在使用 Bash 命令行时出现意外行为,因为它被解释为环境变量。
接下来,提供额外的信息:
What is your first and last name?
[Unknown]: my-cn.localhost
What is the name of your organizational unit?
[Unknown]: Java Devs
What is the name of your organization?
[Unknown]: Baeldung
What is the name of your City or Locality?
[Unknown]: London
What is the name of your State or Province?
[Unknown]: Greater London
What is the two-letter country code for this unit?
[Unknown]: GB
Is CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB correct?
[no]: yes
Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 90 days
for: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
最后,确认 my-keystore.jks
文件是否已生成:
$ ls | grep my-keystore.jks
my-keystore.jks
现在我们可以开始介绍在生成的 keystore 文件中检查证书名称和别名的两种方法。
3. 使用 Java KeyStore API 检查证书名称和别名
这种方法利用了 Java Keystore API,并适用于 X509 证书。首先,我们读取 keystore 文件:
KeyStore readKeyStore() throws Exception {
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(getClass().getResourceAsStream(KEYSTORE_FILE), KEYSTORE_PWD.toCharArray());
return keystore;
}
接下来,当 keystore 中存在匹配别名和名称的证书时,我们将验证情况:
@Test
void whenCheckingAliasAndName_thenMatchIsFound() throws Exception {
KeyStore keystore = readKeyStore();
assertThat(keystore.containsAlias("baeldung")).isTrue();
X509Certificate x509Certificate =
(X509Certificate) keystore.getCertificate("baeldung");
String ownerName = x509Certificate.getSubjectX500Principal().getName();
assertThat(ownerName.contains("my-cn.localhost")).isTrue();
}
最后,当我们检查 keystore 中不存在指定别名或名称的证书时,我们将验证:
@Test
void whenCheckingAliasAndName_thenNameIsNotFound() throws Exception {
KeyStore keystore = readKeyStore();
assertThat(keystore.containsAlias("baeldung")).isTrue();
X509Certificate x509Certificate =
(X509Certificate) keystore.getCertificate("baeldung");
String ownerName = x509Certificate.getSubjectX500Principal().getName();
assertThat(ownerName.contains("commonName1")).isFalse();
}
@Test
void whenCheckingAliasAndName_thenAliasIsNotFound() throws Exception {
KeyStore keystore = readKeyStore();
assertThat(keystore.containsAlias("alias1")).isFalse();
}
4. 使用 keytool
工具检查证书名称和别名
第二种方法使用 keytool
工具和 alias
参数:
$ keytool -list -v -alias baeldung -keystore my-keystore.jks -storepass storepw@1 | grep my-cn.localhost
Owner: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
Issuer: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
请注意,我们也使用了 grep
命令来搜索证书名称。 上述命令在找不到证书别名和名称匹配时会返回空结果。
5. 总结
在这篇教程中,我们学习了如何使用两种方法在 Java keystore 文件中检查证书名称和别名。第一种方法使用 Java KeyStore API,而第二种方法使用 keytool
工具。当需要在多个 keystore 文件中查找特定别名和名称的 keystore 时,这些方法非常有用。
如往常一样,完整的代码可以在 GitHub 上找到。