I have created a class
org.apache.activemq.ActiveMQSslConnectionFactoryx ()
that extends org.apache.activemq.ActiveMQSslConnectionFactory which
provides
a constructor public ActiveMQSslConnectionFactoryx(String keyStore,
String
keyStorePassword, String trustStore) so that you can provide the
keyStore
(client.ks) /trustStore (client.ts) which you can create as
instructed by
this page (http://activemq.apache.org/how-do-i-use-ssl.html). It has
private methods getTrustManagers and getKeyManagers which plug into
org.apache.activemq.ActiveMQSslConnectionFactory's
setKeyAndTrustManagers()
method as soon as ActiveMQSslConnectionFactoryx's constructor is
called....
So, this class encapsulates all the needed ssl/kestore
functionality and I
have got this working with my test environment. This will save the
user
from having to set the system properties
javax.net.ssl.keyStore=/path/to/client.ks,
javax.net.ssl.keyStorePassword=password,
javax.net.ssl.trustStore=/path/to/client.ts as suggested in the
page (
http://activemq.apache.org/how-do-i-use-ssl.html).
Maybe a better thing would be to modify
org.apache.activemq.ActiveMQSslConnectionFactory class itself and
provide
the constructor, getManagers, setManagers methods as I suggested
and use the
original class itself.
I would like to contribute the following code for this purpose:
=
=
=
=
=
=
=
=
=
=====================================================================
package org.apache.activemq;
import java.io.*;
import java.security.*;
import javax.net.ssl.*;
import javax.jms.*;
import org.apache.commons.ssl.*;
/**
* @author Sudip Shrestha
*
* Class that extends ActiveMQSslConnectionFactory so that it can use
client.ks/client.ts files without having to set
* System Properties: javax.net.ssl.keyStore=/path/to/client.ks,
javax.net.ssl.keyStorePassword=password,
* javax.net.ssl.trustStore=/path/to/client.ts.
*/
public class ActiveMQSslConnectionFactoryx extends
ActiveMQSslConnectionFactory
{
private String keyStore;
private String keyStorePassword;
private String trustStore;
public ActiveMQSslConnectionFactoryx()
{
super();
keyStore = keyStorePassword = trustStore = "";
}
public ActiveMQSslConnectionFactoryx(String keyStore, String
keyStorePassword, String trustStore)
throws java.security.NoSuchAlgorithmException,
java.security.KeyStoreException,
java.io.IOException,
java.security.GeneralSecurityException
{
super();
this.keyStore = keyStore;
this.keyStorePassword = keyStorePassword;
this.trustStore = trustStore;
setKeyAndTrustManagers( getKeyManagers( ),getTrustManagers( ),new
java.security.SecureRandom() );
}
private TrustManager[] getTrustManagers() throws
java.security.NoSuchAlgorithmException,
java.security.KeyStoreException,
java.io.IOException,
java.security.GeneralSecurityException
{
System.out.println( "Initiating TrustManagers" );
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream( trustStore ), null );
TrustManagerFactory tmf =
TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
System.out.println( "Initiated TrustManagers" );
return tmf.getTrustManagers();
}
private KeyManager[] getKeyManagers()
throws java.security.NoSuchAlgorithmException,
java.security.KeyStoreException,
java.security.GeneralSecurityException,
java.security.cert.CertificateException,
java.io.IOException, java.security.UnrecoverableKeyException
{
System.out.println( "Initiating KeyManagers" );
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream( keyStore ),
keyStorePassword.toCharArray() );
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm() );
kmf.init( ks, keyStorePassword.toCharArray());
System.out.println( "Initiated KeyManagers" );
return kmf.getKeyManagers();
}
}
Thanks,
Sudip Shrestha
Omaha, NE
=
=
=
=
=
=
=
=
=
=====================================================================
I think it should be provided in the next release of
On Thu, May 15, 2008 at 10:38 AM, Hiram Chirino <[EMAIL PROTECTED]
>
wrote:
I like that idea...
On Wed, May 14, 2008 at 3:33 PM, sudip shrestha <[EMAIL PROTECTED]>
wrote:
I was wondering maybe extending the
org.apache.activemq.ActiveMQSslConnectionFactory class and
providing
hooks
to set KeyManagers and TrustManagers will do the trick....
On Wed, May 14, 2008 at 7:00 AM, Gary Tully <[EMAIL PROTECTED]>
wrote:
it should respond to the javax.net.ssl.* system properties[1] but
these may have too far reaching an effect.
[1]
http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Customization
2008/5/12 sudip shrestha <[EMAIL PROTECTED]>:
Is it possible to do this with the current version of Activemq
with
tomcat?
Any suggestion is highly appreciated. Thanks.
On Thu, May 8, 2008 at 10:21 AM, sudip shrestha
<[EMAIL PROTECTED]>
wrote:
Is it possible to setup jndi with ssl connection for Activemq in
tomcat.
If so where do I define the client.ks/client.ts files?
My jndi config in context.xml file:
<Context antiJARLocking="true">
<Resource
name="jms/ConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="ssl://localhost:61617"
brokerName="LocalActiveMQBroker"
useEmbeddedBroker="false"/>
</Context>
--
Regards,
Hiram
Blog: http://hiramchirino.com
Open Source SOA
http://open.iona.com