
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, chooseClientAlias
así 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