1. 概要

このクイックチュートリアルでは、Javaの信頼できる証明書のリストを、すばやく実用的な例で読み取る方法を学習します。

2. KeyStoreを読み込んでいます

Javaは、信頼できる証明書を、Javaインストールフォルダー内にあるcacertsという名前の特別なファイルに保存します。

このファイルを読んでKeyStoreにロードすることから始めましょう。

private KeyStore loadKeyStore() {
    String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
    String filename = System.getProperty("java.home") + relativeCacertsPath;
    FileInputStream is = new FileInputStream(filename);

    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    String password = "changeit";
    keystore.load(is, password.toCharArray());

    return keystore;
}

このKeyStoreのデフォルトのパスワードは“ changeit” ですが、システムで以前に変更された場合は異なる可能性があります。

ロードされると、 KeyStore は信頼できる証明書を保持します。次に、それらの読み取り方法を説明します。

3. 指定されたKeyStoreからの証明書の読み取り

PKIXParameters クラスを使用します。このクラスは、コンストラクターパラメーターとしてKeyStoreを取ります。

@Test
public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
    KeyStore keyStore = loadKeyStore();
    PKIXParameters params = new PKIXParameters(keyStore);

    Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
    List<Certificate> certificates = trustAnchors.stream()
      .map(TrustAnchor::getTrustedCert)
      .collect(Collectors.toList());

    assertFalse(certificates.isEmpty());
}

PKIXParameters クラスは通常、証明書の検証に使用されますが、この例では、KeyStoreからの証明書を正確にするために使用しました。

PKIXParametrs のインスタンスを作成すると、KeyStoreに存在する信頼できる証明書を含むTrustAnchorのリストが作成されます。

TrustAnchor インスタンスは、単に信頼できる証明書を表します。

4. デフォルトからの証明書の読み取りKeyStore

TrustManagerFactoryクラスを使用し、デフォルトの KeyStoreを使用するKeyStoreなしで初期化することにより、システムに存在する信頼できる証明書のリストを取得することもできます。

KeyStore を明示的に指定しない場合、前の章と同じものがデフォルトで使用されます。

@Test
public void whenLoadingDefaultKeyStore_thenCertificatesArePresent() {
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init((KeyStore) null);

    List<TrustManager> trustManagers = Arrays.asList(trustManagerFactory.getTrustManagers());
    List<X509Certificate> certificates = trustManagers.stream()
      .filter(X509TrustManager.class::isInstance)
      .map(X509TrustManager.class::cast)
      .map(trustManager -> Arrays.asList(trustManager.getAcceptedIssuers()))
      .flatMap(Collection::stream)
      .collect(Collectors.toList());

    assertFalse(certificates.isEmpty());
}

上記の例では、SSL接続のリモート部分を認証するために使用される特殊なTrustManagerであるX509TrustManagerを使用しました。

仕様は、 init() KeyStoreパラメーターがnull

5. 証明書のエイリアス

証明書エイリアスは、証明書を一意に識別するStringです。

Javaによってインポートされたデフォルトの証明書の中には、パブリックインターネットドメインレジストラであるGoDaddyによって発行された有名な証明書もあります。これは、テストで使用します。

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

KeyStoreに存在するすべての証明書エイリアスを読み取る方法を見てみましょう。

@Test
public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() {
    KeyStore keyStore = loadKeyStore();

    Enumeration<String> aliasEnumeration = keyStore.aliases();
    List<String> aliases = Collections.list(aliasEnumeration);
    assertTrue(aliases.contains(GODADDY_CA_ALIAS));
}

次の例では、エイリアスによって証明書を取得する方法を確認します。

@Test
public void whenLoadingKeyStore_thenGoDaddyCertificateIsPresent() {
    KeyStore keyStore = loadKeyStore();

    Certificate goDaddyCertificate = keyStore.getCertificate(GODADDY_CA_ALIAS);
    assertNotNull(goDaddyCertificate);
}

6. 結論

この簡単な記事では、Javaで信頼できる証明書を一覧表示するさまざまな方法を、すばやく実用的な例で見てきました。

いつものように、コードスニペットはGitHubにあります。