1. 概要

このチュートリアルでは、トラストアンカーとは何かについて説明します。 さらに、TrustStoreのデフォルトの場所と予想されるファイル形式を示します。 最後に、エラーの理由を明確にします。「 java .security.InvalidAlgorithmParameterException :トラストアンカーパラメーターは空でない必要があります」。

2. トラストアンカーの定義

まず、トラストアンカーとは何かを説明しましょう。 暗号化システムでは、トラストアンカーは、信頼が想定され、派生するルートエンティティを定義します。 X.509のようなアーキテクチャでは、ルート証明書はトラストアンカーです。 さらに、ルート証明書は、チェーン内の他のすべての証明書の信頼を保証します。

3. TrustStore場所と形式

TrustStoreの場所とJavaの形式を見てみましょう。 まず、Javaは2つの場所で TrustStore を(順番に)探します。

  • $ JAVA_HOME / lib / security / jssecacerts
  • $ JAVA_HOME / lib / security / cacerts

デフォルトの場所をパラメータ-Djavax.net.ssl.trustStore。で上書きできます。

さらに、パラメーター -Djavax.net.ssl.trustStorePassword を使用すると、TrustStoreにパスワードを指定できます。 最後に、コマンドは次のようになります。

java -Djavax.net.ssl.trustStore=/some/loc/on/server/ our_truststore.jks -Djavax.net.ssl.trustStorePassword=our_password -jar application.jar

さらに、JKSはデフォルトのTrustStore形式です。 パラメータ-Djavax.net.ssl.trustStoreTypeを使用すると、デフォルトのTrustStoreタイプを上書きできます。

$ JAVA _HOME / lib / security /cacertsに対して実行されたJava16のkeytoolユーティリティからの出力を見てみましょう。

$ keytool -list -cacerts
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 90 entries
....

予想通り、KeyStoreタイプはJKSです。 さらに、90個すべての証明書がファイルに保存されました。

4. 例外の理由

ここで、例外「 java .security.InvalidAlgorithmParameterException :trustAnchorsパラメーターは空でない必要があります」を見てみましょう。

まず、Javaランタイムは、KeyStoreから証明書を読み取るために使用されるPKIXParametersクラスでのみInvalidAlgorithmParameterExceptionを作成します。 PKIXParametersのコンストラクターは、パラメーターとして指定されたKeyStoreからtrustAnchorsを収集します。

提供されたKeyStoreにtrustAnchors がない場合、例外がスローされます。

...
if (trustAnchors.isEmpty()) {
    throw new InvalidAlgorithmParameterException("the trustAnchors " +
        "parameter must be non-empty");
}
...

ケースを再現してみましょう。 まず、空のKeyStoreを作成しましょう

private KeyStore getKeyStore() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException {
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(null, "changeIt".toCharArray());
    return ks;
}

PKIXParametersクラスのインスタンス化をテストしてみましょう。

@Test
public void whenOpeningTrustStore_thenExceptionIsThrown() throws Exception {
    KeyStore keyStore = getKeyStore();
    InvalidAlgorithmParameterException invalidAlgorithmParameterException =
      Assertions.assertThrows(InvalidAlgorithmParameterException.class, () -> new PKIXParameters(keyStore));
    Assertions.assertEquals("the trustAnchors parameter must be non-empty", invalidAlgorithmParameterException.getMessage());
}

つまり、コンストラクターは期待どおりに例外をスローしました。 つまり、指定された KeyStore に信頼できる証明書がない場合、PKIXParametersクラスのインスタンスを作成することはできません。

5. 結論

この短い記事では、トラストアンカーとは何かについて説明しました。 次に、デフォルトのTrustStoreの場所とファイル形式を示しました。 最後に、「トラストアンカーパラメータは空でない必要があります」というエラーの理由を示しました。

いつものように、例のソースコードはGitHubから入手できます。