On Sat, 2007-01-27 at 12:08 -0800, Julius Davies wrote: > Hi, Folks, > > Don't worry - it's not "not-yet-commons-ssl" dependent at all! It's a > generic way to allow any default user-defined socket factory. I'm pinching > the technique from something I saw when using SSL and LDAP in Java: >
Hi Julius, I, for one, think one way or another we should have a means to plug in the functionality provided by 'not-yet-commons-ssl' instead of maintaining our own home-brewed code in the 'contrib' packages. If such a mechanism is shared by all commons, even better. Oleg > > ----------------------------------------------------------------------- > Example showing "ldaps://" with Java > ----------------------------------------------------------------------- > // Build Hashtable environment for LDAP binding. > Hashtable env = new Hashtable(); > env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" > ); > env.put( Context.PROVIDER_URL, "ldap://ldap.mydomain.com" ); > env.put( Context.SECURITY_AUTHENTICATION, "simple" ); > env.put( Context.SECURITY_PRINCIPAL, windowsUser + "@mydomain.com" ); > env.put( Context.SECURITY_CREDENTIALS, windowsPassword ); > env.put( Context.REFERRAL, "follow" ); > env.put( Context.SECURITY_PROTOCOL, "ssl" ); > > > // Here's the important part - the "hook": > env.put( "java.naming.ldap.factory.socket", "a.b.c.MySoCalledSSLFactory" ); > > LdapContext ctx = new InitialLdapContext( env, null ); > ----------------------------------------------------------------------- > > I just wrote an email to "commons-dev" detailing this idea. I thought > httpcomponents might also find it interesting, so here's a copy & paste of > that email I just wrote to "commons-dev": > > ----------------------------------------------------------------------- > If you are interested, here's how you provide the hook to " > not-yet-commons-ssl.jar". > > Add a new "config property" (config file, System.getProperty(), get/set > bean... however you normally do these things) to your library. The property > should be something like this: > > "org.apache.commons.net.ssl.clientFactory" > > If the property is not, your library should probably just default to this: > > HttpsURLConnection.getDefaultSSLSocketFactory(); > > That's usually preferable to SSLSocketFactory.getDefault() because > HttpsURLConnection's default socket factory will magically use the browser's > ssl-proxy settings and client certs if Java is being run from "Webstart" or > from an applet. (And, seriously, you never know where someone is going to > use your library!) > > Anyway... back to "not-yet-commons-ssl".... > > Suppose the following is set: > > org.apache.commons.net.ssl.factory=a.b.c.SSL > > The contract of the "hook" is that the class specified will contain a static > getDefault() method, so you can use this to get the factory: > > > Class c = Class.forName( "a.b.c.SSL" ); > Method m = c.getMethod( "getDefault", null ); > SSLSocketFactory sf = (SSLSocketFactory) m.invoke( null, null ); > > > Meanwhile, the application developer who's using your library can then do > something like this to specify a particular set of TrustAnchors, Client > Certificates, special validation, etc, that they know they need when using > SSL in their environment. (Really handy for dealing with self-signed "dev" > certs in a way that doesn't pollute every SSL socket then created anywhere > in the JVM!). > > package a.b.c; > public class SSL extends org.apache.commons.ssl.SSLClient { > > public SSL() throws GeneralSecurityException, IOException { > super(); > super.setCheckCRL( true ); > super.setCheckHostname ( false ); > super.setCheckExpiry( false ); > > TrustMaterial tm = new TrustMaterial( "/path/to/certs.pem" ); > char[] password = "secret".toCharArray(); > KeyMaterial km = new KeyMaterial( "/path/to/pkcs12.der", password ); > > super.setTrustMaterial( tm ); > super.setKeyMaterial( km ); > } > } > > > The nice thing about this hook: "commons-net" doesn't have to include ANY > reference to "not-yet-commons-ssl". There's no compile-time dependency, and > certainly no runtime dependency. The static getDefault() method is already > a standard part of javax.net.ssl.SSLSocketFactory! Application developers > using your library *could* specify this! > > org.apache.commons.net.ssl.clientFactory=javax.net.ssl.SSLSocketFactory > ----------------------------------------------------------------------- > > Bringing this back to "o.a.c.http", this technique is all about one line in > the code, and nothing else: > > // Line 215 of o.a.c.h.conn.ssl.SSLSocketFactory: > this.socketfactory = HttpsURLConnection.getDefaultSSLSocketFactory(); > > That line of code would change to look for a property first before finally > settling on HttpsURLConnection.getDefaultSSLSocketFactory(). > > All our existing "SecureSocketFactory" stuff still remains the same, because > it's very handy (I would even say "critically important") to be able to > create "https-abc://" and "https-xyz://" schemes that have different SSL > behaviour. > > But this does allow an application to quickly change the default behaviour > of "http.client" SSL without touching anything else. I think it could also > become a good "standard technique" for all libraries that create SSL > sockets. > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
