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 上找到。