I see that I forgot to mention that you need to add your provider master
class into the list of providers by adding an entry in java.security of the
form:

  security.provider.n=com.anachron.security.Provider

where n is a number that is one greater than the highest one already in your
java.security file.

Also, be careful of some of the URLs that I provided.  They may break into
multiple lines so you'll have to cut and paste.

Gary

 

> -----Original Message-----
> From: Gary L Peskin [mailto:[EMAIL PROTECTED] 
> Sent: Thursday, December 18, 2003 12:29 PM
> To: [EMAIL PROTECTED]
> Subject: RE: SecureSocketFactory pluggability?
> 
> 
> Hi, Stuart --
> 
> Thank you for the explanation.  I think I understand what 
> you're trying to do.  It seems to me that there is a much 
> better way to go about this. Please bear in mind, however, 
> that I've never actually done this myself so you can take 
> this for what it's worth but I think it bears exploring.
> 
> What you are really looking for, as I see it, is to implement 
> your own KeyManager.  It is the KeyManager that decides which 
> certification to present to the other side as part of the SSL 
> handshake.  You could use a single KeyStore with a single 
> password and have the KeyManager determine which client 
> certificate to present to each partner.
> 
> Providing your own KeyManager using JSSE pluggability is 
> documented in an extremely poor fashion but here is what I've 
> been able to glean and surmise from the documentation.
> 
> Select your own KeyManagerFactory algorithm.  The one 
> provided by Sun is SunX509 so you could pick anything else.  
> Let's say you use 
> "Anachron".
> 
> In your java.security properties file, change 
> 
>   ssl.KeyManagerFactory.algorithm=SunX509
> 
> to 
> 
>   ssl.KeyManagerFactory.algorithm=Anachron
> 
> Now, you need to write a Master Class for a provider for the 
> KeyManagerFactory.  For this, see 
> 
>  
> http://java.sun.com/j2se/1.4.2/docs/guide/security/HowToImplAP
> rovider.html#S
> teps
> 
> There is a sample provider shown that you can leverage off 
> of.  For example, your master class  might be called 
> com.anachron.security.Provider.  In the constructor, your 
> provider will "put" the property
> 
>   KeyManagerFactory.Anachron
> 
> and assign it a value that is a classname of a simple class 
> that you will write that extends KeyManagerFactorySpi.  We'll 
> call that class com.anachron.security.KeyManagerFactorySpi.
> 
> Now, all you need to do is implement the abstract methods of 
> javax.net.ssl.KeyManagerFactorySpi in your class.  For the 
> implementation of engineKeyManagers(), you'll return a one 
> entry array consisting of an instance of KeyManager that 
> you'll write which we'll call 
> com.anachron.security.X509KeyManager which, in turn, wraps 
> com.sun.net.ssl.internal.ssl.JsseX509KeyManager.  For an idea 
> (only an idea) of how to do this, see the example at:
> 
>  
> http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERe
> fGuide.html#Ow
> nX509TM
> 
> Note that this example is for a TrustManager, not a 
> KeyManager, but it will give you the general flavor of what 
> to do.  Instead of implementing the checkServerTrusted 
> method, you'll implement the chooseClientAlias.  When you are 
> called, the SSL drivers will pass you the Socket that you're 
> connecting to as the third argument.  In your routine, you 
> should be able to call
> socket.getRemoteSocketAddress() to see who you're connected 
> to.  However, it
> (obviously) won't show you the URL that has passed over the 
> socket.  You might want to stash something in ThreadLocal 
> storage (: or somewhere to let you know where this thread is 
> trying to connect.
> 
> Just my thoughts.
> 
> Gary
> 
> 
> > -----Original Message-----
> > From: Stuart Miller [mailto:[EMAIL PROTECTED]
> > Sent: Thursday, December 18, 2003 8:42 AM
> > To: '[EMAIL PROTECTED]'
> > Subject: RE: SecureSocketFactory pluggability?
> > 
> > 
> > Gary, thanks for offering to help.  Let me try to clarify 
> my problem.
> > 
> > As I understand it, Axis will create HTTPS (SSL) connections
> > transparently, using the underlying JSSE.  When the client 
> > connects to the server, the SSL connection will receive the 
> > server's certificate, which much be trusted in order for the 
> > connection to succeed.  That means I must have the 
> > server-cert's CA in my 'trustStore' (not surprising there).  
> > The trustStore is by default the "cacerts" file in 
> > $JAVA_HOME/jre/lib/security".  If I want to use a different 
> > Trust Store, I can set the 'javax.net.ssl.trustStore' System 
> > property (and corresponding 
> > 'javax.net.ssl.trustStorePassword') in order for JSSE to use 
> > the proper store.  This is a system-wide setting (per-VM), 
> > and hence not changeable for each client within a VM making 
> > SSL connections.
> > 
> > Furthermore, if the server challenges me for a
> > client-certificate, JSSE will look for an <<appropriate>> (i 
> > am unsure how a cert is selected if there is more than 1) 
> > certificate in the default 'keyStore'.  Similarly, I can 
> > override the default KeyStore with the 'javax.net.ssl.keyStore' (and
> > javax.net.ssl.keyStorePassword') System properties.  I 
> > believe that the key/cert in the store must either have the 
> > same password as the KeyStore, or else none (if not, how do I 
> > pass it in?)
> > 
> > Since I don't want keys/certs with no password in my
> > KeyStore, and I don't want them all to have the same password 
> > as the KeyStore itself... I _could_ also create the KeyStore 
> > (and TrustStore) dynamically, the following way:
> > 
> > SSLContext.getInstance("SSL").init(keyManagers,
> > trustManagers, secureRandom);
> > 
> > ...and hence build a 1-key keyManager and 1 CA trustManager
> > to use, on-demand.  Using Axis's generated Java stubs 
> > (wsdl2java) I don't have access to the SSL context of the 
> > specific connection (and I'm not even sure if I can alter the 
> > SSL properties of a single SSL connection), and I don't want 
> > to alter the gloabl SSLContext as it will affect other 
> > connections which occurr simultaneously.
> > 
> > If I could override the SecureSocketFactory inside JSSE
> > (which JDK1.4 does not let you do), I could write a factory 
> > which is pre-configured to use speicific client key/certs and 
> > CA certs for specific URLs or hostsnames.
> > Example:
> > 
> > https://soapserver1.com/ key1 CAx
> > https://soapserver2.net key2 CAy
> > etc...
> > 
> > Since I cannot, my only option _seems_ to be putting all keys
> > in one KeyStore, putting all CA certs in one TrustStore 
> > (naturally, this I can live with), and making all keys have 
> > the same password, which is that of the KeyStore itself.  
> > Then, the SSL connection will figure out which 
> > client-certificate to use to establish the session (I don't 
> > know how this works, but I suppose a combination of algorithm 
> > support and/or Issuer DN??, but there could be more than one 
> > acceptable client cert to use).  
> > 
> > I didn't know about the 'axis.secureSocketFactory' property
> > (I'm quite new to Axis), but I figured since JSSE won't let 
> > me plug in my own, then Axis cannot either.  Perhaps this 
> > property was used only for people running JDK1.3 + JSSE 
> > extension?  There is of course the SunJSSESocketFactory 
> > provided with Axis, which gives me some customization, though 
> > I have no idea if I can use it, nor how to instantiate it 
> > with the 'attributes' Hashtable it takes which can hold 
> > 'keyStore', 'keyStorePass', etc.  Is this coming from 
> > AxisClientEngine??
> > 
> > In summary, I need to have each Axis client connection
> > proivde it's own client-cert that it will present to the 
> > server, if/when prompted.  Is this possible in some (nice, 
> > configurable) way?  If there is a way, does using generated 
> > Stubs leave me with fewer options, without having to edit 
> > their source?
> > 
> > Many thanks in advance for any light you can shed on this.
> > 
> > Kind regards,
> > Stuart
> > 
> > 
> > 
> > 
> > -----Original Message-----
> > From: Gary L Peskin [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday 17 December 2003 18:37
> > To: [EMAIL PROTECTED]
> > Subject: RE: SecureSocketFactory pluggability?
> > 
> > 
> > I'd like to understand better what's happening here and I
> > think I can help.
> > 
> > Can you please explain the first few paragraphs in baby steps
> > so that I can understand the exact problem?
> > 
> > Is the problem that you can't specify the socket factory that
> > Axis will use? Have you looked at the properties 
> > axis.SocketFactory and axis.socketSecureFactory?
> > 
> > If you could take just a few minutes, it would be great.
> > 
> > Thanks,
> > Gary
> > 
> > > -----Original Message-----
> > > From: Stuart Miller [mailto:[EMAIL PROTECTED]
> > > Sent: Wednesday, December 17, 2003 2:21 AM
> > > To: '[EMAIL PROTECTED]'
> > > Subject: SecureSocketFactory pluggability?
> > > 
> > > 
> > > The Axis framework seems pluggable with respect to 
> SocketFactories, 
> > > as was JSSE prior to the JDK 1.4.  Now with JDK 1.4, I 
> cannot swap 
> > > SocketFactory impls (via java.security
> > > file) due to US export regulations.
> > > 
> > > With the out-of-the-box JSSESocketFactory, I can alter the System 
> > > properties 'javax.net.ssl.xxx' to point it to my 
> trust/cert stores, 
> > > and tell it the passwords.  However, what if I need a different 
> > > cert/trust store for each client?
> > > 
> > > If I could tell Java/Axis to use the SunJSSESocketFactory 
> (or my own 
> > > version), then I could build a Hashtable of properties specifying 
> > > 'keystore' 'keyStorePass', etc.  But alas, I cannot with JDK1.4
> > > 
> > > eg. SecureSocketFactory ssf = 
> > > (SecureSocketFactory)SocketFactoryFactory.getFactory("https",
> > > myProps);
> > > 
> > > So I'm left with
> > > System.setProperty("javax.net.ssl.xxx", "xyz");
> > > 
> > > as the only way to tell Aix which CA's to trust and which client 
> > > certs it can use.  But I assume these properties are only read 
> > > once.. the first time the SocketFactory for HTTPS is 
> created.  Even 
> > > if not, changing them at run-time is not safe due to multiple 
> > > clients running at the same time.
> > > 
> > > Furhtermore, when I use wsdl2java to generate Java stubs, 
> I seem to 
> > > be completely insulated from any ability to change SSL 
> environment 
> > > things such as trustStore and keyStore.  It's all automatic and 
> > > hidden.
> > > 
> > > Has someone any idea of how I can do what I'm trying to do?
> > > 
> > > Can I, for example, alter the SSL connection parameters in the 
> > > context of some Stub (ie. access the SecureSocket being used)?  
> > > Something like this...
> > > 
> > > SSLContext.getInstance("SSL").init(keyMgrs, trustMgrs,
> > secureRandom);
> > > 
> > > ...only synchronized in a way that prevents other clients from 
> > > connecting with these params until i'm done?
> > > 
> > > Any help is greatly appreciated.  I have connections 
> working fine, 
> > > including client-auth, but I [seem to] lack the ability to have 
> > > different settings for each client in a single VM.
> > > 
> > > Stuart
> > > 
> > 
> 

Reply via email to