¿Cómo maneja Java varias claves de cliente en el almacén de claves pero 1 en el almacén de confianza al realizar mtls?

¿Cómo maneja Java varias claves de cliente en el almacén de claves pero 1 en el almacén de confianza al realizar mtls?

Tengo una situación en la que intento configurar mtls donde el cliente tiene varias claves. Parece que no puedo encontrar cómo funciona la resolución de qué alias, así que ¿puede guiarme en algún lugar aquí?

¿Cómo decide Java qué alias usar cuando hay varias claves en el almacén de claves pero solo una de ellas está en el almacén de confianza del servidor?

Actualizar

Actualmente tengo el siguiente código

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);
    }
    ...
  }
}

Pero el punto de quiebre no parece funcionar, chooseClientAliasasí que no creo que lo llamen.

Respuesta1

Muchas cosas, pero creo que lo más fácil es publicar el ejemplo.

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

Esto parece funcionar correctamente. Para probar el caso de error, cambie el alias del cliente a algo como client3

información relacionada