SSL mit EJB3 im JBoss 4.0.x
Möchte man einen Java Swing-Client elegant per Webstart an einen Application-Server anbinden wird häufig SSL-Verschlüsselung benötigt. Hier beschreibe ich das Vorgehen zur SSL-Absicherung von EJB3 SessionBeans im JBoss.
Überblick
Möchte man seinen Anwendern zur Abwechslung in einem Projekt einmal keine Weboberfläche zumuten so besteht eine elegante Lösung darin, einen Java Swing Client zu schreiben, der über Java Webstart gestartet wird. Häufig wird in dieser Konstellation auf Geschäftslogik dann über Stateless SessionBeans zugegriffen. Da die Kommunikation in diesem Szenario aber nicht immer über ein gesichertes Netz stattfinden kann, möchte man die Aufrufe entsprechend verschlüsseln. Hier soll kurz beschrieben werden, wie dies für EJB3 SessionBeans im freien Application Server JBoss geschieht.
Das Vorgehen ist relativ einfach, jedoch in alter Open Source Tradition etwas schwer im Netz zusammenzusuchen:
- SSL-Keystore erstellen
- EJB3-Deployer auf SSL umstellen
- Client-Aufrufe umstellen
SSL-Keystore erstellen
Dies geht eigentlich recht einfach, z.B. über das bei Java mitgelieferte keytool:
keytool -genkey -alias tc-ssl -keyalg RSA -keystore server.keystore -validity 3650
Aber auch über einen Ant-Task ist dies problemlso möglich
<target name=”genKey” description=”generate Key”>
<genkey alias=”autosigner” keystore=”${src.dir}/local.keystore” storepass=”testKey”>
<dname>
<param name=”CN” value=”autosigner”/>
<param name=”OU” value=”Bernd Ruecker”/>
<param name=”O” value=”camunda GmbH”/>
<param name=”C” value=”DE”/>
</dname>
</genkey>
</target>
EJB3-Deployer auf SSL umstellen
Sollen alle EJB3’s per SSL angesprochen werden kann man am einfachsten den EJB3 Deployer umstellen, dazu die Datei ejb3.deployer/META-INF/jboss-service.xml im deploy Verzeichnis des JBoss editieren.
Statt
<mbean code="org.jboss.remoting.transport.Connector" xmbean-dd="org/jboss/remoting/transport/Connector.xml" name="jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3"> <depends>jboss.aop:service=AspectDeployer</depends> <attribute name="InvokerLocator">socket://${jboss.bind.address}:3873</attribute> <attribute name="Configuration"> <handlers> <handler subsystem="AOP">org.jboss.aspects.remoting.AOPRemotingInvocationHandler</handler> </handlers> </attribute> </mbean>
folgendes eintragen:
<mbean code="org.jboss.remoting.transport.Connector" xmbean-dd="org/jboss/remoting/transport/Connector.xml" name="jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3"> display-name="Socket transport Connector"> <attribute name="Configuration"> <config> <invoker transport="sslsocket"> <attribute name="serverSocketFactory">jboss.remoting:service=ServerSocketFactory,type=SSL</attribute> <attribute name="serverBindAddress">${jboss.bind.address}</attribute> <attribute name="serverBindPort">3843</attribute> </invoker> <handlers> <handler subsystem="AOP">org.jboss.aspects.remoting.AOPRemotingInvocationHandler</handler> </handlers> </config> </attribute> <depends>jboss.remoting:service=ServerSocketFactory,type=SSL</depends> <depends>jboss.aop:service=AspectDeployer</depends> </mbean> <mbean code="org.jboss.remoting.security.SSLSocketBuilder" name="jboss.remoting:service=SocketBuilder,type=SSL" display-name="SSL Server Socket Factory Builder"> <attribute name="UseSSLServerSocketFactory">false</attribute> <attribute name="KeyStoreURL">ccs.keystore</attribute> <attribute name="KeyStorePassword">sslCCS</attribute> <attribute name="KeyStoreType">JKS</attribute> </mbean> <mbean code="org.jboss.remoting.security.SSLServerSocketFactoryService" name="jboss.remoting:service=ServerSocketFactory,type=SSL" display-name="SSL Server Socket Factory"> <depends optional-attribute-name="SSLSocketBuilder" proxy-type="attribute">jboss.remoting:service=SocketBuilder,type=SSL</depends> </mbean>
Die Keystore Einstellungen sind natürlich anzupassen (die keystore Datei am besten in JBOSS_SERVER/conf ablegen, dann wird sie gefunden).
Client
Im Client muss nun der KeyStore angegeben werden, dies kann ganz einfach per Java-Properties z.B. über die Kommandozeile geschehen. Da dies bei Webstart auch nicht so ohne ist, kann man dies auch im Programm selbst machen. In unserem Fall haben wir den Keystore im User-Home Verzeichnis erwartet. Dies hat nun gleich noch den Vorteil, dass der Benutzer diese Datei explizit benötigt, was auch einen kleinen Schutz darstellt.
String keyStoreFile = System.getProperty("user.home") + System.getProperty("file.separator") + "ccs.keystore"; System.setProperty("javax.net.ssl.trustStore", keyStoreFile); System.setProperty("javax.net.ssl.trustStorePassword", "sslCCS");
Fazit
Das schöne an dieser Lösung ist, dass sie prinzipiell keinerlei Änderung an der vorhanden Anwendung erfordert und somit alle EJB-Anwendungen auf SSL umgestellt werden können.
Leave a reply