package org.ws4d.java.security; import java.net.Socket; import java.security.Principal; import java.security.PrivateKey; import java.security.cert.X509Certificate; import javax.net.ssl.X509KeyManager; /** * The ForcedAliasKeyManager uses the next available alias from the keystore * with the most similarity to the given alias. E.g. if the given alias is * "https://example.device/test/beta" and there is no such alias in the store * the alias "example.device/test/beta" will be searched for instead. */ public class ForcedAliasKeyManager implements X509KeyManager { private X509KeyManager baseKM; private String alias; public ForcedAliasKeyManager(X509KeyManager baseKM, String alias) { this.baseKM = baseKM; this.alias = alias; } public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { // For each keyType, call getClientAliases on the base KeyManager // to find valid aliases. If our requested alias is found, select it // for return. boolean aliasFound = false; String nearestAlias = alias; while (nearestAlias.length() > 1 && !aliasFound) { for (int i = 0; i < keyType.length && !aliasFound; i++) { String[] validAliases = baseKM.getClientAliases(keyType[i], issuers); if (validAliases != null) { for (int j = 0; j < validAliases.length && !aliasFound; j++) { if (validAliases[j].toLowerCase().equals(nearestAlias.toLowerCase())) aliasFound = true; } } } int lastIndex = -1; if (aliasFound) nearestAlias = (lastIndex = nearestAlias.lastIndexOf('/')) < 0 ? "" : nearestAlias.substring(lastIndex + 1); } this.alias = nearestAlias; if (aliasFound) { return nearestAlias; } else return null; } public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) { return baseKM.chooseServerAlias(keyType, issuers, socket); } public X509Certificate[] getCertificateChain(String arg0) { return baseKM.getCertificateChain(arg0); } public String[] getClientAliases(String keyType, Principal[] issuers) { return baseKM.getClientAliases(keyType, issuers); } public PrivateKey getPrivateKey(String arg0) { return baseKM.getPrivateKey(arg0); } public String[] getServerAliases(String keyType, Principal[] issuers) { return baseKM.getServerAliases(keyType, issuers); } }