| | |
| | | |
| | | /** |
| | | * This class is in charge of checking whether the certificates that are |
| | | * presented are trusted or not. This implementation tries to check also |
| | | * that the subject DN of the certificate corresponds to the host passed |
| | | * using the setHostName method. |
| | | * presented are trusted or not. This implementation tries to check also that |
| | | * the subject DN of the certificate corresponds to the host passed using the |
| | | * setHostName method. |
| | | *<p> |
| | | * The constructor tries to use a default TrustManager from the system |
| | | * and if it cannot be retrieved this class will only accept the |
| | | * certificates explicitly accepted by the user (and specified by |
| | | * calling acceptCertificate). |
| | | * The constructor tries to use a default TrustManager from the system and if it |
| | | * cannot be retrieved this class will only accept the certificates explicitly |
| | | * accepted by the user (and specified by calling acceptCertificate). |
| | | *<p> |
| | | * NOTE: this class is not aimed to be used when we have connections in |
| | | * parallel. |
| | |
| | | * @param password |
| | | * The keystore password to use for this keymanager. |
| | | */ |
| | | ApplicationKeyManager(KeyStore keystore, char[] password) |
| | | ApplicationKeyManager(final KeyStore keystore, final char[] password) |
| | | { |
| | | KeyManagerFactory kmf = null; |
| | | String userSpecifiedAlgo = System |
| | |
| | | // Handle IBM specific cases if the user did not specify a algorithm |
| | | // and/or provider. |
| | | if (userSpecifiedAlgo == null && Platform.isVendor("IBM")) |
| | | { |
| | | userSpecifiedAlgo = "IbmX509"; |
| | | } |
| | | if (userSpecifiedProvider == null && Platform.isVendor("IBM")) |
| | | { |
| | | userSpecifiedProvider = "IBMJSSE2"; |
| | | } |
| | | |
| | | // Have some fallbacks to choose the provider and algorith of the |
| | | // key manager. First see if the user wanted to use something |
| | | // specific, then try with the SunJSSE provider and SunX509 |
| | | // algorithm. Finally, fallback to the default algorithm of the JVM. |
| | | String[] preferredProvider = { userSpecifiedProvider, "SunJSSE", |
| | | final String[] preferredProvider = { userSpecifiedProvider, "SunJSSE", |
| | | null, null }; |
| | | String[] preferredAlgo = { userSpecifiedAlgo, "SunX509", "SunX509", |
| | | final String[] preferredAlgo = { userSpecifiedAlgo, "SunX509", "SunX509", |
| | | TrustManagerFactory.getDefaultAlgorithm() }; |
| | | for (int i = 0; i < preferredProvider.length && keyManager == null; i++) |
| | | { |
| | | String provider = preferredProvider[i]; |
| | | String algo = preferredAlgo[i]; |
| | | final String provider = preferredProvider[i]; |
| | | final String algo = preferredAlgo[i]; |
| | | if (algo == null) |
| | | { |
| | | continue; |
| | |
| | | kmf = KeyManagerFactory.getInstance(algo); |
| | | } |
| | | kmf.init(keystore, password); |
| | | KeyManager kms[] = kmf.getKeyManagers(); |
| | | final KeyManager kms[] = kmf.getKeyManagers(); |
| | | /* |
| | | * Iterate over the returned keymanagers, look for an instance |
| | | * of X509KeyManager. If found, use that as our "default" key |
| | | * manager. |
| | | * Iterate over the returned keymanagers, look for an instance of |
| | | * X509KeyManager. If found, use that as our "default" key manager. |
| | | */ |
| | | for (int j = 0; j < kms.length; j++) |
| | | for (final KeyManager km : kms) |
| | | { |
| | | if (kms[i] instanceof X509KeyManager) |
| | | { |
| | | keyManager = (X509KeyManager) kms[j]; |
| | | keyManager = (X509KeyManager) km; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | catch (NoSuchAlgorithmException e) |
| | | catch (final NoSuchAlgorithmException e) |
| | | { |
| | | // Nothing to do. Maybe we should avoid this and be strict, but |
| | | // we are in a best effor mode. |
| | | LOG.log(Level.WARNING, "Error with the algorithm", e); |
| | | } |
| | | catch (KeyStoreException e) |
| | | catch (final KeyStoreException e) |
| | | { |
| | | // Nothing to do. Maybe we should avoid this and be strict, but |
| | | // we are in a best effor mode.. |
| | | LOG.log(Level.WARNING, "Error with the keystore", e); |
| | | } |
| | | catch (UnrecoverableKeyException e) |
| | | catch (final UnrecoverableKeyException e) |
| | | { |
| | | // Nothing to do. Maybe we should avoid this and be strict, but |
| | | // we are in a best effor mode. |
| | | LOG.log(Level.WARNING, "Error with the key", e); |
| | | } |
| | | catch (NoSuchProviderException e) |
| | | catch (final NoSuchProviderException e) |
| | | { |
| | | // Nothing to do. Maybe we should avoid this and be strict, but |
| | | // we are in a best effor mode. |
| | |
| | | |
| | | |
| | | /** |
| | | * Choose an alias to authenticate the client side of a secure socket |
| | | * given the public key type and the list of certificate issuer |
| | | * authorities recognized by the peer (if any). |
| | | * Choose an alias to authenticate the client side of a secure socket given |
| | | * the public key type and the list of certificate issuer authorities |
| | | * recognized by the peer (if any). |
| | | * |
| | | * @param keyType |
| | | * the key algorithm type name(s), ordered with the |
| | | * most-preferred key type first. |
| | | * the key algorithm type name(s), ordered with the most-preferred |
| | | * key type first. |
| | | * @param issuers |
| | | * the list of acceptable CA issuer subject names or null if |
| | | * it does not matter which issuers are used. |
| | | * the list of acceptable CA issuer subject names or null if it does |
| | | * not matter which issuers are used. |
| | | * @param socket |
| | | * the socket to be used for this connection. This parameter |
| | | * can be null, in which case this method will return the |
| | | * most generic alias to use. |
| | | * the socket to be used for this connection. This parameter can be |
| | | * null, in which case this method will return the most generic alias |
| | | * to use. |
| | | * @return the alias name for the desired key, or null if there are no |
| | | * matches. |
| | | */ |
| | | public String chooseClientAlias(String[] keyType, |
| | | Principal[] issuers, Socket socket) |
| | | public String chooseClientAlias(final String[] keyType, |
| | | final Principal[] issuers, final Socket socket) |
| | | { |
| | | if (keyManager != null) |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * Choose an alias to authenticate the client side of a secure socket |
| | | * given the public key type and the list of certificate issuer |
| | | * authorities recognized by the peer (if any). |
| | | * Choose an alias to authenticate the client side of a secure socket given |
| | | * the public key type and the list of certificate issuer authorities |
| | | * recognized by the peer (if any). |
| | | * |
| | | * @param keyType |
| | | * the key algorithm type name(s), ordered with the |
| | | * most-preferred key type first. |
| | | * the key algorithm type name(s), ordered with the most-preferred |
| | | * key type first. |
| | | * @param issuers |
| | | * the list of acceptable CA issuer subject names or null if |
| | | * it does not matter which issuers are used. |
| | | * the list of acceptable CA issuer subject names or null if it does |
| | | * not matter which issuers are used. |
| | | * @param socket |
| | | * the socket to be used for this connection. This parameter |
| | | * can be null, in which case this method will return the |
| | | * most generic alias to use. |
| | | * the socket to be used for this connection. This parameter can be |
| | | * null, in which case this method will return the most generic alias |
| | | * to use. |
| | | * @return the alias name for the desired key, or null if there are no |
| | | * matches. |
| | | */ |
| | | public String chooseServerAlias(String keyType, Principal[] issuers, |
| | | Socket socket) |
| | | public String chooseServerAlias(final String keyType, |
| | | final Principal[] issuers, final Socket socket) |
| | | { |
| | | if (keyManager != null) |
| | | { |
| | |
| | | * |
| | | * @param alias |
| | | * the alias name |
| | | * @return the certificate chain (ordered with the user's certificate |
| | | * first and the root certificate authority last), or null if |
| | | * the alias can't be found. |
| | | * @return the certificate chain (ordered with the user's certificate first |
| | | * and the root certificate authority last), or null if the alias |
| | | * can't be found. |
| | | */ |
| | | public X509Certificate[] getCertificateChain(String alias) |
| | | public X509Certificate[] getCertificateChain(final String alias) |
| | | { |
| | | if (keyManager != null) |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * Get the matching aliases for authenticating the server side of a |
| | | * secure socket given the public key type and the list of certificate |
| | | * issuer authorities recognized by the peer (if any). |
| | | * Get the matching aliases for authenticating the server side of a secure |
| | | * socket given the public key type and the list of certificate issuer |
| | | * authorities recognized by the peer (if any). |
| | | * |
| | | * @param keyType |
| | | * the key algorithm type name |
| | | * @param issuers |
| | | * the list of acceptable CA issuer subject names or null if |
| | | * it does not matter which issuers are used. |
| | | * @return an array of the matching alias names, or null if there were |
| | | * no matches. |
| | | * the list of acceptable CA issuer subject names or null if it does |
| | | * not matter which issuers are used. |
| | | * @return an array of the matching alias names, or null if there were no |
| | | * matches. |
| | | */ |
| | | public String[] getClientAliases(String keyType, Principal[] issuers) |
| | | public String[] getClientAliases(final String keyType, |
| | | final Principal[] issuers) |
| | | { |
| | | if (keyManager != null) |
| | | { |
| | |
| | | * the alias name |
| | | * @return the requested key, or null if the alias can't be found. |
| | | */ |
| | | public PrivateKey getPrivateKey(String alias) |
| | | public PrivateKey getPrivateKey(final String alias) |
| | | { |
| | | if (keyManager != null) |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * Get the matching aliases for authenticating the server side of a |
| | | * secure socket given the public key type and the list of certificate |
| | | * issuer authorities recognized by the peer (if any). |
| | | * Get the matching aliases for authenticating the server side of a secure |
| | | * socket given the public key type and the list of certificate issuer |
| | | * authorities recognized by the peer (if any). |
| | | * |
| | | * @param keyType |
| | | * the key algorithm type name |
| | | * @param issuers |
| | | * the list of acceptable CA issuer subject names or null if |
| | | * it does not matter which issuers are used. |
| | | * @return an array of the matching alias names, or null if there were |
| | | * no matches. |
| | | * the list of acceptable CA issuer subject names or null if it does |
| | | * not matter which issuers are used. |
| | | * @return an array of the matching alias names, or null if there were no |
| | | * matches. |
| | | */ |
| | | public String[] getServerAliases(String keyType, Principal[] issuers) |
| | | public String[] getServerAliases(final String keyType, |
| | | final Principal[] issuers) |
| | | { |
| | | if (keyManager != null) |
| | | { |