在執行 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 之類的名稱

相關內容