bloritsch    01/11/01 12:35:52

  Modified:    bin      jmeter.properties
               src/org/apache/jmeter/util IaikSSLManager.java
                        JsseSSLManager.java SSLManager.java
               src/org/apache/jmeter/util/keystore JmeterKeyStore.java
  Log:
  Current state of SSL Management infrastructure
  
  Revision  Changes    Path
  1.32      +3 -1      jakarta-jmeter/bin/jmeter.properties
  
  Index: jmeter.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/bin/jmeter.properties,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- jmeter.properties 2001/10/29 22:03:13     1.31
  +++ jmeter.properties 2001/11/01 20:35:52     1.32
  @@ -20,8 +20,10 @@
   #And the package name where Stream Handlers can be found
   #These provided defaults can be uncommented, and they will work if you are using
   #Sun's JSSE implementation.
  -#ssl.provider=com.sun.net.ssl.internal.ssl.Provider
  +ssl.provider=com.sun.net.ssl.internal.ssl.Provider
   #ssl.pkgs=com.sun.net.ssl.internal.www.protocol
  +#ssl.provider=iaik.security.jsse.provider.IAIKJSSEProvider
  +javax.net.ssl.trustStore=/Documents and Settings/bloritsch/Desktop/giacomo/cacerts
   
   #Alternative protocol of the ssl provider for IAIK JCE + iSaSiLk
   #ssl.pkgs=iaik.protocol
  
  
  
  1.8       +57 -28    jakarta-jmeter/src/org/apache/jmeter/util/IaikSSLManager.java
  
  Index: IaikSSLManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/org/apache/jmeter/util/IaikSSLManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- IaikSSLManager.java       2001/11/01 16:30:26     1.7
  +++ IaikSSLManager.java       2001/11/01 20:35:52     1.8
  @@ -55,15 +55,17 @@
   package org.apache.jmeter.util;
   
   import iaik.protocol.https.HttpsURLConnection;
  -import iaik.security.ssl.KeyAndCert;
   import iaik.security.ssl.SSLClientContext;
  -import iaik.security.ssl.SSLContext;
  +import iaik.security.ssl.ClientTrustDecider;
  +import iaik.security.ssl.SSLCertificate;
   import org.apache.jmeter.gui.GuiPackage;
   import org.apache.jmeter.util.keystore.JmeterKeyStore;
   
   import java.net.HttpURLConnection;
   import java.security.KeyStore;
   import java.security.PrivateKey;
  +import java.security.Principal;
  +import java.security.Provider;
   import java.security.cert.X509Certificate;
   
   /**
  @@ -74,35 +76,59 @@
    * make a decision, it will pop open a dialog asking you for more information.
    *
    * @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
  - * @version CVS $Revision: 1.7 $ $Date: 2001/11/01 16:30:26 $
  + * @version CVS $Revision: 1.8 $ $Date: 2001/11/01 20:35:52 $
    */
   public class IaikSSLManager extends SSLManager {
  -    private SSLContext context;
  -    private KeyAndCert identity;
  +    private SSLClientContext context;
   
  -    public void setContext(HttpURLConnection conn) {
  -        if (conn instanceof HttpsURLConnection) {
  -            HttpsURLConnection secureConn = (HttpsURLConnection) conn;
  -            secureConn.setSSLContext(this.context);
  +    protected static class AlwaysTrustDecider implements ClientTrustDecider {
  +        protected X509Certificate[] certs;
  +
  +        public AlwaysTrustDecider(KeyStore store) {
  +            try {
  +                java.util.Enumeration enum = store.aliases();
  +                java.util.ArrayList list = new java.util.ArrayList(store.size());
  +                while (enum.hasMoreElements())
  +                {
  +                    String alias = (String) enum.nextElement();
  +                    System.out.print("AlwaysTrustDecider alias: " + alias);
  +
  +                    if (store.isCertificateEntry(alias)) {
  +                        list.add(store.getCertificate(alias));
  +                        System.out.println(" INSTALLED");
  +                    } else {
  +                        System.out.println(" SKIPPED");
  +                    }
  +                }
  +                this.certs = (X509Certificate[]) list.toArray(new X509Certificate[] 
{});
  +            } catch (Exception e) {
  +                this.certs = null;
  +            }
           }
  -    }
   
  -    /**
  -     * Opens and initializes the KeyStore.  If the password for the KeyStore is
  -     * not set, this method will prompt you to enter it.  Unfortunately, there is
  -     * no PasswordEntryField available from JOptionPane.
  -     */
  -    private KeyAndCert getKeyAndCert() {
  -        if (null == this.identity) {
  -            JmeterKeyStore keyStore = this.getKeyStore();
  -            X509Certificate[] certs = keyStore.getCertificateChain();
  -            PrivateKey key = keyStore.getPrivateKey();
  -            System.out.println("Alias: " + keyStore.getAlias());
  +        public boolean isTrustedPeer(SSLCertificate cert) {
  +            System.out.println("AlwaysTrustDecider: isTrusted???\n" + 
cert.toString());
  +            return true;
  +        }
   
  -            this.identity = new KeyAndCert(certs, key);
  +        public PrivateKey getPrivateKey() {
  +            System.out.println("AlwaysTrustDecider: getPrivateKey");
  +            return null;
           }
   
  -        return this.identity;
  +        public SSLCertificate getCertificate(byte[] cert, Principal[] p1, String 
p2) {
  +            System.out.println("AlwaysTrustDecider: getCertificate");
  +            try {
  +                X509Certificate newCert = new iaik.x509.X509Certificate(cert);
  +                return new 
SSLCertificate(iaik.x509.ChainVerifier.orderCertificateChain(newCert, this.certs));
  +            } catch (Exception e) {}
  +            return null;
  +        }
  +    }
  +
  +    public void setContext(HttpURLConnection conn) {
  +        HttpsURLConnection secureConn = (HttpsURLConnection) conn;
  +        secureConn.setSSLContext(this.context);
       }
   
       /**
  @@ -110,18 +136,21 @@
        * this object.  Create the SSLContext, and wrap all the X509KeyManagers with
        * our X509KeyManager so that we can choose our alias.
        */
  -    protected IaikSSLManager() {
  +    public IaikSSLManager(Provider provider) {
           this.setProvider(new iaik.security.provider.IAIK());
           this.setProvider(new sun.security.provider.Sun());
  -        SSLClientContext clientContext = new SSLClientContext();
  +        this.context = new SSLClientContext();
   
           if ("all".equalsIgnoreCase(JMeterUtils.getPropDefault("javax.net.debug", 
"none"))) {
  -            clientContext.setDebugStream(System.err);
  +            this.context.setDebugStream(System.err);
           }
   
  -        clientContext.addClientCredentials(this.getKeyAndCert());
  +        JmeterKeyStore keyStore = this.getKeyStore();
  +        this.context.setTrustDecider(new AlwaysTrustDecider(this.getTrustStore()));
  +        this.context.addClientCredentials(keyStore.getCertificateChain(),
  +                                          keyStore.getPrivateKey());
   
  -        this.context = clientContext;
  +        System.out.println(keyStore.getClass().toString());
           System.out.println("IaikSSLManager installed");
       }
   }
  
  
  
  1.8       +100 -30   jakarta-jmeter/src/org/apache/jmeter/util/JsseSSLManager.java
  
  Index: JsseSSLManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/org/apache/jmeter/util/JsseSSLManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JsseSSLManager.java       2001/11/01 16:27:58     1.7
  +++ JsseSSLManager.java       2001/11/01 20:35:52     1.8
  @@ -76,27 +76,97 @@
    * make a decision, it will pop open a dialog asking you for more information.
    *
    * @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
  - * @version CVS $Revision: 1.7 $ $Date: 2001/11/01 16:27:58 $
  + * @version CVS $Revision: 1.8 $ $Date: 2001/11/01 20:35:52 $
    */
   public class JsseSSLManager extends SSLManager {
       /** Cache the SecureRandom instance because it takes a long time to create */
       private SecureRandom rand;
       /** Cache the Context so we can retrieve it from other places */
       private SSLContext context = null;
  +    private Provider pro = null;
   
  +    protected static class AlwaysTrustManager implements X509TrustManager {
  +        protected X509Certificate[] certs;
  +
  +        public AlwaysTrustManager(KeyStore store) {
  +            try {
  +                java.util.Enumeration enum = store.aliases();
  +                java.util.ArrayList list = new java.util.ArrayList(store.size());
  +                while (enum.hasMoreElements())
  +                {
  +                    String alias = (String) enum.nextElement();
  +                    System.out.print("AlwaysTrustManager alias: " + alias);
  +
  +                    if (store.isCertificateEntry(alias)) {
  +                        list.add(store.getCertificate(alias));
  +                        System.out.println(" INSTALLED");
  +                    } else {
  +                        System.out.println(" SKIPPED");
  +                    }
  +                }
  +                this.certs = (X509Certificate[]) list.toArray(new X509Certificate[] 
{});
  +            } catch (Exception e) {
  +                this.certs = null;
  +            }
  +        }
  +
  +        public X509Certificate[] getAcceptedIssuers() {
  +            System.out.println("Get accepted Issuers");
  +            return certs;
  +        }
  +
  +        public boolean isClientTrusted(X509Certificate[] chain) {
  +            System.out.println("Is client trusted ???");
  +            return true;
  +        }
  +
  +        public boolean isServerTrusted(X509Certificate[] chain) {
  +            System.out.println("Is server trusted ???");
  +            return true;
  +        }
  +    }
  +
       /**
        * Returns the SSLContext we are using.  It is useful for obtaining the 
SSLSocketFactory
        * so that your created sockets are authenticated.
        */
       private SSLContext getContext() {
  +        if (null == this.context) {
  +            try {
  +                this.context = SSLContext.getInstance("TLS", this.pro);
  +            } catch (Exception e) {
  +                try {
  +                    this.context = SSLContext.getInstance("TLS");
  +                } catch (Exception ee) {}
  +            }
  +
  +            try {
  +                KeyManagerFactory managerFactory = 
KeyManagerFactory.getInstance("SunX509");
  +                JmeterKeyStore keys = this.getKeyStore();
  +                managerFactory.init(null, this.defaultpw.toCharArray());
  +                KeyManager[] managers = managerFactory.getKeyManagers();
  +                System.out.println(keys.getClass().toString());
  +
  +                for (int i = 0; i < managers.length; i++) {
  +                    if (managers[i] instanceof X509KeyManager) {
  +                        X509KeyManager manager = (X509KeyManager) managers[i];
  +                        managers[i] = new WrappedX509KeyManager(manager, keys);
  +                    }
  +                }
  +
  +                TrustManager[] trusts = new TrustManager[] {new 
AlwaysTrustManager(this.getTrustStore())};
  +                context.init(managers, trusts, this.rand);
  +                
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
  +            } catch (Exception e) {
  +            }
  +        }
  +
           return this.context;
       }
   
       public void setContext(HttpURLConnection conn) {
  -        if (conn instanceof HttpsURLConnection) {
  -            HttpsURLConnection secureConn = (HttpsURLConnection) conn;
  -            secureConn.setSSLSocketFactory(this.getContext().getSocketFactory());
  -        }
  +        HttpsURLConnection secureConn = (HttpsURLConnection) conn;
  +        secureConn.setSSLSocketFactory(this.getContext().getSocketFactory());
       }
   
       /**
  @@ -104,7 +174,17 @@
        * this object.  Create the SSLContext, and wrap all the X509KeyManagers with
        * our X509KeyManager so that we can choose our alias.
        */
  -    protected JsseSSLManager() {
  +    public JsseSSLManager(Provider provider) {
  +        setProvider(provider);
  +        try {
  +            Class iaikProvider = 
SSLManager.class.getClassLoader().loadClass("iaik.security.jsse.provider.IAIKJSSEProvider");
  +            setProvider((Provider) iaikProvider.newInstance());
  +        } catch (Exception e) {}
  +        try {
  +            Class sunProvider =  
SSLManager.class.getClassLoader().loadClass("com.sun.net.ssl.internal.ssl.Provider");
  +            setProvider((Provider) sunProvider.newInstance());
  +        } catch (Exception e) {}
  +
           if (null == this.rand) {
               this.rand = new SecureRandom();
           }
  @@ -113,33 +193,14 @@
               System.setProperty("javax.net.debug", "all");
           }
   
  +        this.getContext();
           System.out.println("JsseSSLManager installed");
       }
  -
  -    protected void setProvider(Provider sslProvider) {
  -        super.setProvider(sslProvider);
  -
  -        try {
  -            this.context = SSLContext.getInstance("TLS", sslProvider);
  -            KeyManagerFactory managerFactory = 
KeyManagerFactory.getInstance("SunX509");
  -            JmeterKeyStore keys = this.getKeyStore();
  -            managerFactory.init(null, this.defaultpw.toCharArray());
  -            KeyManager[] managers = managerFactory.getKeyManagers();
  -            TrustManagerFactory trustFactory = 
TrustManagerFactory.getInstance("SunX509");
  -            KeyStore certs = this.getTrustStore();
  -            trustFactory.init(certs);
  -            TrustManager[] trusts = trustFactory.getTrustManagers();
  -
  -            for (int i = 0; i < managers.length; i++) {
  -                if (managers[i] instanceof X509KeyManager) {
  -                    X509KeyManager manager = (X509KeyManager) managers[i];
  -                    managers[i] = new WrappedX509KeyManager(manager, keys);
  -                }
  -            }
   
  -            context.init(managers, trusts, this.rand);
  -            
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
  -        } catch (Exception e) {
  +    protected final void setProvider(Provider p) {
  +        super.setProvider(p);
  +        if (null == this.pro) {
  +            this.pro = p;
           }
       }
   
  @@ -189,6 +250,8 @@
            * @param issuers  The CA certificates we are narrowing our selection on.
            */
           public String[] getClientAliases(String keyType, Principal[] issuers) {
  +            System.out.println("WrappedX509Manager: getClientAliases: ");
  +            System.out.println(new String[] {this.store.getAlias()});
               return new String[] {this.store.getAlias()};
           }
   
  @@ -200,6 +263,8 @@
            * @param issuers  The CA certificates we are narrowing our selection on.
            */
           public String chooseServerAlias(String keyType, Principal[] issuers) {
  +            System.out.println("WrappedX509Manager: chooseServerAlias: " +
  +                               this.manager.chooseServerAlias(keyType, issuers));
               return this.manager.chooseServerAlias(keyType, issuers);
           }
   
  @@ -211,6 +276,8 @@
            * @param issuers  The CA certificates we are narrowing our selection on.
            */
           public String[] getServerAliases(String keyType, Principal[] issuers) {
  +            System.out.println("WrappedX509Manager: getServerAliases: ");
  +            System.out.println(this.manager.getServerAliases(keyType, issuers));
               return this.manager.getServerAliases(keyType, issuers);
           }
   
  @@ -220,6 +287,8 @@
            * @param alias  The client alias
            */
           public X509Certificate[] getCertificateChain(String alias) {
  +            System.out.println("WrappedX509Manager: getCertificateChain(" + alias + 
")");
  +            System.out.println(this.store.getCertificateChain());
               return this.store.getCertificateChain();
           }
   
  @@ -229,6 +298,7 @@
            * @param alias  The client alias
            */
           public PrivateKey getPrivateKey(String alias) {
  +            System.out.println("WrappedX509Manager: getPrivateKey: " + 
this.store.getPrivateKey());
               return this.store.getPrivateKey();
           }
       }
  
  
  
  1.11      +16 -27    jakarta-jmeter/src/org/apache/jmeter/util/SSLManager.java
  
  Index: SSLManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/org/apache/jmeter/util/SSLManager.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- SSLManager.java   2001/11/01 16:27:58     1.10
  +++ SSLManager.java   2001/11/01 20:35:52     1.11
  @@ -54,6 +54,7 @@
    */
   package org.apache.jmeter.util;
   
  +import java.lang.reflect.Constructor;
   import java.io.File;
   import java.io.FileInputStream;
   import java.security.Provider;
  @@ -73,7 +74,7 @@
    * make a decision, it will pop open a dialog asking you for more information.
    *
    * @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
  - * @version CVS $Revision: 1.10 $ $Date: 2001/11/01 16:27:58 $
  + * @version CVS $Revision: 1.11 $ $Date: 2001/11/01 20:35:52 $
    */
   public abstract class SSLManager {
       /** Singleton instance of the manager */
  @@ -173,9 +174,10 @@
                   }
               } catch (Exception e) {
               }
  -        }
   
  +        System.out.println("JmeterKeyStore Location: " + fileName);
           System.out.println("JmeterKeyStore type: " + 
this.keyStore.getClass().toString());
  +        }
   
           return this.keyStore;
       }
  @@ -185,18 +187,13 @@
        */
       protected KeyStore getTrustStore() {
           if (null == this.trustStore) {
  -            String fileName = 
JMeterUtils.getPropDefault("javax.net.ssl.trustStore", null);
  +            String fileName = 
JMeterUtils.getPropDefault("javax.net.ssl.trustStore", "");
               System.setProperty("javax.net.ssl.trustStore", fileName);
   
               try {
                   if (fileName.endsWith(".iaik")) {
                       this.trustStore = KeyStore.getInstance("IAIKKeyStore", "IAIK");
  -                }
  -                if (fileName.endsWith(".p12") || fileName.endsWith(".P12")) {
  -                    this.trustStore = KeyStore.getInstance("pkcs12");
  -                    System.out.println("KeyStore Type: PKCS 12");
  -                    System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
  -                } else {
  +                }  else {
                       this.trustStore = KeyStore.getInstance("JKS");
                       System.out.println("KeyStore Type: JKS");
                   }
  @@ -214,15 +211,18 @@
   
                   if (initStore.exists()) {
                       try {
  -                        this.trustStore.load(new FileInputStream(initStore), 
"changeit".toCharArray());
  +                        this.trustStore.load(new FileInputStream(initStore), null);
                       } catch (Exception e) {
                           throw new RuntimeException("Can't load KeyStore!!!  " + 
e.getMessage());
                       }
                   } else {
  -                    this.trustStore.load(null, "changeit".toCharArray());
  +                    this.trustStore.load(null, null);
                   }
               } catch (Exception e) {
               }
  +
  +            System.out.println("TrustStore Location: " + fileName);
  +            System.out.println("TrustStore type: " + 
this.keyStore.getClass().toString());
           }
   
           return this.trustStore;
  @@ -249,9 +249,9 @@
                   }
   
                   try {
  -                    Class clazz = 
SSLManager.class.getClassLoader().loadClass(classname);
  -                    SSLManager.manager = (SSLManager) clazz.newInstance();
  -                    SSLManager.manager.setProvider(SSLManager.sslProvider);
  +                    Class clazz = Class.forName(classname);
  +                    Constructor con = clazz.getConstructor(new Class[] 
{Provider.class});
  +                    SSLManager.manager = (SSLManager) con.newInstance(new Object[] 
{SSLManager.sslProvider});
                   } catch (Exception e) {
                       e.printStackTrace(System.err);
                       SSLManager.isSSLSupported = false;
  @@ -275,20 +275,9 @@
       {
           try {
               SSLManager.sslProvider = 
(Provider)Class.forName(JMeterUtils.getPropDefault("ssl.provider",null)).newInstance();
  -        } catch (Exception ssl) {
  -            try {
  -                Class iaikProvider = 
SSLManager.class.getClassLoader().loadClass("iaik.security.jsse.provider.IAIKJSSEProvider");
  -                SSLManager.sslProvider = (Provider) iaikProvider.newInstance();
  -                //System.setProperty("java.protocol.handler.pkgs", "iaik.protocol");
  -            } catch (Exception e) {
  -                try {
  -                    Class sunProvider =  
SSLManager.class.getClassLoader().loadClass("com.sun.net.ssl.internal.ssl.Provider");
  -                    SSLManager.sslProvider = (Provider) sunProvider.newInstance();
  -                } catch (Exception noSSL) {
  -                    SSLManager.isSSLSupported = false;
  -                    SSLManager.sslProvider = null;
  -                }
  -            }
  +        } catch (Exception noSSL) {
  +            SSLManager.isSSLSupported = false;
  +            SSLManager.sslProvider = null;
           }
   
           try {
  
  
  
  1.3       +6 -2      
jakarta-jmeter/src/org/apache/jmeter/util/keystore/JmeterKeyStore.java
  
  Index: JmeterKeyStore.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/org/apache/jmeter/util/keystore/JmeterKeyStore.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JmeterKeyStore.java       2001/10/31 18:42:35     1.2
  +++ JmeterKeyStore.java       2001/11/01 20:35:52     1.3
  @@ -64,7 +64,7 @@
    * Use this Keystore for JMeter specific KeyStores.
    *
    * @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
  - * @version CVS $Revision: 1.2 $ $Date: 2001/10/31 18:42:35 $
  + * @version CVS $Revision: 1.3 $ $Date: 2001/11/01 20:35:52 $
    */
   public abstract class JmeterKeyStore {
   
  @@ -98,6 +98,10 @@
               } catch (Exception e) {}
           }
   
  -        return new DefaultKeyStore(type);
  +        Class keyStore = Class.forName
  +            ("org.apache.jmeter.util.keystore.DefaultKeyStore");
  +        Constructor con = keyStore.getConstructor(
  +            new Class[] {String.class});
  +        return (JmeterKeyStore) con.newInstance(new Object[] {type});
       }
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to