Skip to content

Commit 796c51e

Browse files
committed
Added option to remove identity route
1 parent cf15ee4 commit 796c51e

3 files changed

Lines changed: 51 additions & 16 deletions

File tree

sslcontext-kickstart/src/main/java/nl/altindag/ssl/keymanager/AggregatedX509ExtendedKeyManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
import java.security.PrivateKey;
2727
import java.security.cert.X509Certificate;
2828
import java.util.Collections;
29-
import java.util.HashMap;
3029
import java.util.LinkedHashMap;
3130
import java.util.List;
3231
import java.util.Map;
3332
import java.util.Objects;
33+
import java.util.concurrent.ConcurrentHashMap;
3434

3535
/**
3636
* Represents an ordered list of {@link X509ExtendedKeyManager} with most-preferred managers first.
@@ -86,7 +86,7 @@ public AggregatedX509ExtendedKeyManager(Map<String, ? extends X509ExtendedKeyMan
8686
public AggregatedX509ExtendedKeyManager(Map<String, ? extends X509ExtendedKeyManager> keyManagers,
8787
Map<String, List<URI>> preferredAliasToHost) {
8888
this.keyManagers = Collections.synchronizedMap(new LinkedHashMap<>(keyManagers));
89-
this.preferredAliasToHost = new HashMap<>(preferredAliasToHost);
89+
this.preferredAliasToHost = new ConcurrentHashMap<>(preferredAliasToHost);
9090
}
9191

9292
/**

sslcontext-kickstart/src/main/java/nl/altindag/ssl/util/KeyManagerUtils.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -233,31 +233,41 @@ public static void swapKeyManager(X509KeyManager baseKeyManager, X509KeyManager
233233
}
234234

235235
public static void addIdentityRoute(X509ExtendedKeyManager keyManager, String alias, String... hosts) {
236-
addIdentityRoute(keyManager, alias, hosts, false);
236+
computeIdentityRoute(keyManager, alias, hosts, false, false);
237237
}
238238

239239
public static void overrideIdentityRoute(X509ExtendedKeyManager keyManager, String alias, String... hosts) {
240-
addIdentityRoute(keyManager, alias, hosts, true);
240+
computeIdentityRoute(keyManager, alias, hosts, true, false);
241241
}
242242

243-
private static void addIdentityRoute(X509ExtendedKeyManager keyManager,
244-
String alias,
245-
String[] hosts,
246-
boolean overrideExistingRouteEnabled) {
243+
public static void removeIdentityRoute(X509ExtendedKeyManager keyManager, String alias) {
244+
computeIdentityRoute(keyManager, alias, null, false, true);
245+
}
246+
247+
private static void computeIdentityRoute(X509ExtendedKeyManager keyManager,
248+
String alias,
249+
String[] hosts,
250+
boolean overrideExistingRouteEnabled,
251+
boolean removeExistingRouteEnabled) {
247252

248253
requireNotNull(keyManager, GENERIC_EXCEPTION_MESSAGE.apply("KeyManager"));
249254
requireNotNull(alias, GENERIC_EXCEPTION_MESSAGE.apply("Alias"));
250-
requireNotNull(keyManager, GENERIC_EXCEPTION_MESSAGE.apply("Host"));
251255

252256
if (keyManager instanceof DelegatingX509ExtendedKeyManager) {
253-
addIdentityRoute(((DelegatingX509ExtendedKeyManager) keyManager).getInnerKeyManager(), alias, hosts, overrideExistingRouteEnabled);
257+
computeIdentityRoute(((DelegatingX509ExtendedKeyManager) keyManager).getInnerKeyManager(), alias, hosts, overrideExistingRouteEnabled, removeExistingRouteEnabled);
254258
return;
255259
}
256260

257261
if (keyManager instanceof AggregatedX509ExtendedKeyManager) {
258262
AggregatedX509ExtendedKeyManager aggregatedX509ExtendedKeyManager = (AggregatedX509ExtendedKeyManager) keyManager;
259263
Map<String, List<URI>> aliasToHosts = aggregatedX509ExtendedKeyManager.getIdentityRoute();
260264

265+
if (removeExistingRouteEnabled) {
266+
aliasToHosts.remove(alias);
267+
return;
268+
}
269+
270+
requireNotNull(hosts, GENERIC_EXCEPTION_MESSAGE.apply("Host"));
261271
List<URI> uris = new ArrayList<>();
262272
for (String host : hosts) {
263273
URI uri = URI.create(host);
@@ -370,9 +380,10 @@ public static void addIdentityMaterial(X509ExtendedKeyManager baseKeyManager, St
370380
return;
371381
}
372382

373-
throw new GenericKeyManagerException(
374-
String.format("The provided keyManager should be an instance of [%s]", InflatableX509ExtendedKeyManager.class.getName())
375-
);
383+
throw new GenericKeyManagerException(String.format(
384+
"KeyManager should be an instance of: [%s], but received: [%s]",
385+
InflatableX509ExtendedKeyManager.class.getName(),
386+
baseKeyManager.getClass().getName()));
376387
}
377388

378389
/**

sslcontext-kickstart/src/test/java/nl/altindag/ssl/util/KeyManagerUtilsShould.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ void addClientIdentityRoutesToInflatableKeyManager() {
357357
KeyStore identityOne = KeyStoreUtils.loadKeyStore(KEYSTORE_LOCATION + IDENTITY_FILE_NAME, IDENTITY_PASSWORD);
358358
KeyStore identityTwo = KeyStoreUtils.loadKeyStore(KEYSTORE_LOCATION + IDENTITY_TWO_FILE_NAME, IDENTITY_PASSWORD);
359359

360-
X509ExtendedKeyManager inflatableKeyManager = KeyManagerUtils.keyManagerBuilder().withInflatableKeyManager(true)
360+
X509ExtendedKeyManager inflatableKeyManager = KeyManagerUtils.keyManagerBuilder()
361+
.withInflatableKeyManager(true)
361362
.withIdentity(identityOne, IDENTITY_PASSWORD, KeyManagerFactory.getDefaultAlgorithm())
362363
.withIdentity(identityTwo, IDENTITY_PASSWORD, KeyManagerFactory.getDefaultAlgorithm())
363364
.build();
@@ -417,6 +418,29 @@ void addClientIdentities() {
417418
.containsValue(Arrays.asList("https://localhost:8443/", "https://localhost:8453/"));
418419
}
419420

421+
@Test
422+
void removeClientIdentityRoutes() {
423+
KeyStore identityOne = KeyStoreUtils.loadKeyStore(KEYSTORE_LOCATION + IDENTITY_FILE_NAME, IDENTITY_PASSWORD);
424+
KeyStore identityTwo = KeyStoreUtils.loadKeyStore(KEYSTORE_LOCATION + IDENTITY_TWO_FILE_NAME, IDENTITY_PASSWORD);
425+
426+
X509ExtendedKeyManager inflatableKeyManager = KeyManagerUtils.keyManagerBuilder()
427+
.withInflatableKeyManager(true)
428+
.withIdentity(identityOne, IDENTITY_PASSWORD, KeyManagerFactory.getDefaultAlgorithm())
429+
.withIdentity(identityTwo, IDENTITY_PASSWORD, KeyManagerFactory.getDefaultAlgorithm())
430+
.build();
431+
432+
KeyManagerUtils.addIdentityRoute(inflatableKeyManager, "client","https://localhost:8443/");
433+
KeyManagerUtils.addIdentityRoute(inflatableKeyManager, "client","https://localhost:8453/");
434+
Map<String, List<String>> identityRoute = KeyManagerUtils.getIdentityRoute(inflatableKeyManager);
435+
436+
assertThat(identityRoute)
437+
.containsKey("client")
438+
.containsValue(Arrays.asList("https://localhost:8443/", "https://localhost:8453/"));
439+
440+
KeyManagerUtils.removeIdentityRoute(inflatableKeyManager, "client");
441+
assertThat(KeyManagerUtils.getIdentityRoute(inflatableKeyManager)).isEmpty();
442+
}
443+
420444
@Test
421445
void addClientIdentityRoutesWhenTryingToOverrideANonExistingRoute() {
422446
KeyStore identityOne = KeyStoreUtils.loadKeyStore(KEYSTORE_LOCATION + IDENTITY_FILE_NAME, IDENTITY_PASSWORD);
@@ -593,7 +617,7 @@ void throwsExceptionWhenAddingIdentityMaterialToNonInflatableKeyManager() {
593617

594618
assertThatThrownBy(() -> KeyManagerUtils.addIdentityMaterial(keyManager, "key-manager-one", identityTwo, IDENTITY_PASSWORD))
595619
.isInstanceOf(GenericKeyManagerException.class)
596-
.hasMessage("The provided keyManager should be an instance of [nl.altindag.ssl.keymanager.InflatableX509ExtendedKeyManager]");
620+
.hasMessage("KeyManager should be an instance of: [nl.altindag.ssl.keymanager.InflatableX509ExtendedKeyManager], but received: [sun.security.ssl.SunX509KeyManagerImpl]");
597621
}
598622

599623
@Test
@@ -607,7 +631,7 @@ void throwsExceptionWhenAddingIdentityMaterialToNonInflatableKeyManagerWrappedIn
607631

608632
assertThatThrownBy(() -> KeyManagerUtils.addIdentityMaterial(keyManager, "key-manager-one", identityTwo, IDENTITY_PASSWORD))
609633
.isInstanceOf(GenericKeyManagerException.class)
610-
.hasMessage("The provided keyManager should be an instance of [nl.altindag.ssl.keymanager.InflatableX509ExtendedKeyManager]");
634+
.hasMessage("KeyManager should be an instance of: [nl.altindag.ssl.keymanager.InflatableX509ExtendedKeyManager], but received: [nl.altindag.ssl.keymanager.AggregatedX509ExtendedKeyManager]");
611635
}
612636

613637
@Test

0 commit comments

Comments
 (0)