For updated content from Camunda, check out the Camunda Blog.

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:

  1. SSL-Keystore erstellen
  2. EJB3-Deployer auf SSL umstellen
  3. 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>

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.

Links

Already read?

Scientific performance benchmark of open source BPMN engines

Why BPMN is not enough

Decision Model and Notation (DMN) – the new Business Rules Standard. An introduction by example.

New Whitepaper: The Zero-Code BPM Myth

Leave a reply