Java は、MTLS を実行するときに、キーストア内の複数のクライアント キーとトラスト ストア内の 1 つのクライアント キーをどのように処理しますか。

Java は、MTLS を実行するときに、キーストア内の複数のクライアント キーとトラスト ストア内の 1 つのクライアント キーをどのように処理しますか。

クライアントが複数のキーを持つ mtls を設定しようとしている状況があります。どのエイリアスを解決するかが分からないので、どこかでガイドしてもらえませんか?

キーストアに複数のキーがあり、そのうちの 1 つだけがサーバー信頼ストアにある場合、Java はどのエイリアスを使用するかをどのように決定するのでしょうか。

アップデート

現在、私は次のコードを持っています

public class ConfigurableAliasKeyManagerFactory extends KeyManagerFactory {
  ...
  private static final class ConfigurableAliasKeyManagerFactorySpi extends KeyManagerFactorySpi {
    ...
    @Override
    protected KeyManager[] engineGetKeyManagers() {
       return Arrays.stream(this.delegate.getKeyManagers())
         .filter(X509ExtendedKeyManager.class::isInstance)
         .map(X509ExtendedKeyManager.class::cast)
         .map(this::wrap)
         .toArray(KeyManager[]::new);
    }
  }
  ...
  protected static final class ConfigurableAliasKeyManager extends X509ExtendedKeyManager {
    @Getter
    private final String alias;

    public ConfigurableAliasKeyManager(X509ExtendedKeyManager keyManager, String alias) {
        this.delegate = keyManager;
        this.alias = alias;
    }
    @Override
    public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
        return (this.alias != null) ? this.alias : this.delegate.chooseClientAlias(keyType, issuers, socket);
    }
    ...
  }
}

しかし、ブレークポイントは機能していないようなchooseClientAliasので、呼び出されないと思います

答え1

いろいろありますが、一番簡単なのは例を投稿することだと思います

https://github.com/jrgleason/spring-boot-mtls

これは正しく動作するようです。失敗ケースをテストするには、クライアントのエイリアスをclient3のように変更します。

関連情報