FileDocCategorySizeDatePackage
SunOneBasicX509TrustManager.javaAPI DocGlassfish v2 API11374Fri May 04 22:36:24 BST 2007com.sun.enterprise.admin.jmx.remote.https

SunOneBasicX509TrustManager

public class SunOneBasicX509TrustManager extends Object implements X509TrustManager
An implementation of {@link X509TrustManager} that provides basic support for Trust Management. As of $Revision: 1.5 $ it checks if the server is trusted and displays the certificate chain that was received from the server. The user is then prompted to confirm the certificate. If confirmed the certificate is entered into the client side asadmintruststore (whose default name is ~/.asadmintruststore). Once in the truststore, the user is never prompted to confirm a second time.
author
Kedar Mhaswade
since
S1AS8.0
version
$Revision: 1.5 $

Fields Summary
private final Object
_alias
private boolean
_alreadyInvoked
private CertificateException
_lastCertException
private RuntimeException
_lastRuntimeException
private static com.sun.enterprise.admin.jmx.remote.IStringManager
_strMgr
Constructors Summary
public SunOneBasicX509TrustManager(Object alias, Map env)
Creates an instance of the SunOneBasicX509TrustManager

param
alias The toString() of the alias object concatenated with a date/time stamp is used as the alias of the trusted server certificate in the client side .asadmintruststore. When null only a date / timestamp is used as an alias.

        
                                                            
          		
        if (_strMgr == null) 
            _strMgr = StringManagerFactory.getClientStringManager(SunOneBasicX509TrustManager.class, env);
        _alias = alias;
        _alreadyInvoked = false;
        _lastCertException = null;
        _lastRuntimeException = null;
    
public SunOneBasicX509TrustManager()
Creates an instance of the SunOneBasicX509TrustManager A date/time stamp is used of the trusted server certificate in the client side .asadmintruststore

        this (null, null);
    
Methods Summary
protected voidcheckCertificate(java.security.cert.X509Certificate[] chain)
This function validates the cert and ensures that it is trusted.

param
chain
throws
RuntimeException
throws
CertificateException

        
        if (chain == null || chain.length == 0) {
            throw new IllegalArgumentException (_strMgr.getString(
                "emptyServerCertificate"));
        } 
        //First ensure that the certificate is valid.
        for (int i = 0 ; i < chain.length ; i ++) {
            chain[i].checkValidity();   
        }
        try {            
            AsadminTruststore truststore = null;
            try {
                truststore = new AsadminTruststore(); 
            } catch (IOException ex) {                    
                //An IOException is thrown when an invalid keystore password is entered.
                //In this case, we prompt the user for the truststore password.                    
                String password = promptForPassword();
                if (password != null) {
                    truststore = new AsadminTruststore(password);
                } else {
                    throw ex;
                }                    
            }
            //if the certificate already exists in the truststore, it is implicitly trusted
            if (!truststore.certificateExists(chain[0])) {
                //if the certificate does not exist in the truststore, then we prompt the
                //user. Upon confirmation from the user, the certificate is added to the 
                //truststore.
                if (isItOKToAddCertToTrustStore(chain[0])) {                            
                    truststore.addCertificate(getAliasName(), chain[0]);
                } else {
                    throw new CertificateException(_strMgr.getString(
                        "serverCertificateNotTrusted"));
                }
            }     
        } catch (CertificateException ex) {
            throw ex;
        } catch (Exception e) {        
            throw new RuntimeException(e);
        }        
	
public voidcheckClientTrusted(java.security.cert.X509Certificate[] x509Certificate, java.lang.String authType)
Checks if client is trusted given the certificate chain and authorization type string, e.g. "RSA".

throws
{@link CertificateException}
throws
{@link UnsupportedOperationException}

		throw new UnsupportedOperationException("Not Implemented for Client Trust Management");
	
public voidcheckServerTrusted(java.security.cert.X509Certificate[] chain, java.lang.String authType)
Checs if the server is trusted.

param
chain The server certificate to be validated.
param
authType
throws
CertificateException

        //The alreadyInvoked flag keeps track of whether we have already prompted the 
        //user. Unfortunately, checkServerTrusted is called 2x and we want to avoid
        //prompting the user twice. I'm not sure of the root cause of this problem (i.e. 
        //why it is called twice. In addition, we keep track of any exception that occurred
        //on the first invocation and propagate that back.
        if (!_alreadyInvoked) {
            _alreadyInvoked = true;            
            try {
                checkCertificate(chain);                
            } catch (RuntimeException ex) {
                _lastRuntimeException = ex;
                throw ex;
            } catch (CertificateException ex) {
                _lastCertException = ex;
                throw ex;
            } 
        } else {
            if (_lastRuntimeException != null) {
                throw _lastRuntimeException;
            } else if (_lastCertException != null) {
                throw _lastCertException;
            }
        }
	
public java.security.cert.X509Certificate[]getAcceptedIssuers()

        return ( new X509Certificate[0] );
    
private java.lang.StringgetAliasName()

        String aliasName = _alias != null ? _alias.toString() : "";
        //We append a timestamp to the alias to ensure that it is unqiue.    
        DateFormat f = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);                    
        aliasName += ":" + f.format(new Date());        
        return aliasName;
    
protected booleanisItOKToAddCertToTrustStore(java.security.cert.X509Certificate c)
Displays the certificate and prompts the user whether or not it is trusted.

param
c
throws
IOException
return
true if the user trusts the certificate

	                  
        if (promptForConfirmation()) {
            System.out.println(c.toString());
            System.out.print(_strMgr.getString("certificateTrustPrompt"));
            BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
            String result = r.readLine();
            if (result != null && result.equalsIgnoreCase("y")) {
                return true;
            } else {
                return false;
            }   
        } else {
            return true;
        }        
    
protected booleanpromptForConfirmation()

return
true if the cert should be displayed and the user asked to confirm it. A return valie of false indicates that the cert will be implicitly trusted and added to the asadmin truststore.

        return true;
    
protected java.lang.StringpromptForPassword()
If we fail to open the client database using the default password (changeit) or the password found in "javax.net.ssl.trustStorePassword" system property, then the fallback behavior is to prompt the user for the password by calling this method.

return
the password to the client side truststore

        if (promptForConfirmation()) {
            System.out.print(_strMgr.getString("certificateDbPrompt"));
            BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
            return r.readLine();
        } else {
            return null;
        }