在执行 mtls 时,Java 如何处理密钥库中有多个客户端密钥但信任库中只有 1 个

在执行 mtls 时,Java 如何处理密钥库中有多个客户端密钥但信任库中只有 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 的内容

相关内容