You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/01/26 14:19:10 UTC

camel git commit: CAMEL-8413 - camel-stomp - Allow to configure SSL

Repository: camel
Updated Branches:
  refs/heads/master 3437b3ed7 -> d3231d349


CAMEL-8413 - camel-stomp - Allow to configure SSL


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d3231d34
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d3231d34
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d3231d34

Branch: refs/heads/master
Commit: d3231d349b05333d78df1a31029091a9635f1f60
Parents: 3437b3e
Author: lburgazzoli <lb...@gmail.com>
Authored: Tue Jan 26 13:01:21 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Jan 26 14:18:07 2016 +0100

----------------------------------------------------------------------
 .../component/stomp/StompConfiguration.java     |  18 +++-
 .../camel/component/stomp/StompEndpoint.java    |   5 +-
 .../camel/component/stomp/StompBaseTest.java    | 102 ++++++++++++++++++-
 .../component/stomp/StompConsumerTest.java      |   2 +-
 .../component/stomp/StompConsumerUriTest.java   |   8 +-
 .../component/stomp/StompProducerTest.java      |   2 +-
 .../component/stomp/StompSslConsumerTest.java   |  38 +++++++
 .../component/stomp/StompSslProducerTest.java   |  38 +++++++
 .../src/test/resources/jsse/client.keystore     | Bin 0 -> 2201 bytes
 .../src/test/resources/jsse/server.keystore     | Bin 0 -> 2201 bytes
 .../src/test/resources/log4j.properties         |   2 +-
 11 files changed, 204 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompConfiguration.java b/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompConfiguration.java
index e5d554e..5365699 100644
--- a/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompConfiguration.java
+++ b/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompConfiguration.java
@@ -20,11 +20,12 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
+import org.apache.camel.util.jsse.SSLContextParameters;
 
 @UriParams
 public class StompConfiguration implements Cloneable {
-
-    @UriParam(defaultValue = "tcp://localhost:61613") @Metadata(required = "true")
+    @UriParam(defaultValue = "tcp://localhost:61613")
+    @Metadata(required = "true")
     private String brokerURL = "tcp://localhost:61613";
     @UriParam
     private String login;
@@ -32,6 +33,8 @@ public class StompConfiguration implements Cloneable {
     private String passcode;
     @UriParam
     private String host;
+    @UriParam(label = "security")
+    private SSLContextParameters sslContextParameters;
 
     /**
      * Returns a copy of this configuration
@@ -89,4 +92,15 @@ public class StompConfiguration implements Cloneable {
         this.passcode = passcode;
     }
 
+    public SSLContextParameters getSslContextParameters() {
+        return sslContextParameters;
+    }
+
+    /**
+     * To configure security using SSLContextParameters
+     */
+    public void setSslContextParameters(SSLContextParameters sslContextParameters) {
+        this.sslContextParameters = sslContextParameters;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompEndpoint.java b/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompEndpoint.java
index 32f54b9..f8b73b2 100644
--- a/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompEndpoint.java
+++ b/components/camel-stomp/src/main/java/org/apache/camel/component/stomp/StompEndpoint.java
@@ -80,11 +80,14 @@ public class StompEndpoint extends DefaultEndpoint {
 
     @Override
     protected void doStart() throws Exception {
-        final Promise<CallbackConnection> promise = new Promise<CallbackConnection>();
+        final Promise<CallbackConnection> promise = new Promise<>();
 
         stomp = new Stomp(configuration.getBrokerURL());
         stomp.setLogin(configuration.getLogin());
         stomp.setPasscode(configuration.getPasscode());
+        if (configuration.getSslContextParameters() != null) {
+            stomp.setSslContext(configuration.getSslContextParameters().createSSLContext());
+        }
         stomp.connectCallback(promise);
         if (configuration.getHost() != null && !configuration.getHost().isEmpty()) {
             stomp.setHost(configuration.getHost());

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompBaseTest.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompBaseTest.java b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompBaseTest.java
index b79325c..3551e7a 100644
--- a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompBaseTest.java
+++ b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompBaseTest.java
@@ -16,9 +16,18 @@
  */
 package org.apache.camel.component.stomp;
 
+import javax.net.ssl.SSLContext;
+
 import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.broker.SslContext;
+import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.test.AvailablePortFinder;
 import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.jsse.KeyManagersParameters;
+import org.apache.camel.util.jsse.KeyStoreParameters;
+import org.apache.camel.util.jsse.SSLContextParameters;
+import org.apache.camel.util.jsse.TrustManagersParameters;
+import org.fusesource.stomp.client.Stomp;
 
 public abstract class StompBaseTest extends CamelTestSupport {
 
@@ -26,6 +35,10 @@ public abstract class StompBaseTest extends CamelTestSupport {
     protected int numberOfMessages = 100;
     protected int port;
     private boolean canTest;
+    private SSLContextParameters serverSslContextParameters;
+    private SSLContext serverSslContext;
+    private SSLContextParameters clientSslContextParameters;
+    private SSLContext clientSslContext;
 
     protected int getPort() {
         return port;
@@ -38,12 +51,26 @@ public abstract class StompBaseTest extends CamelTestSupport {
         return canTest;
     }
 
+    protected boolean isUseSsl() {
+        return false;
+    }
+
     @Override
     public boolean isUseRouteBuilder() {
         return false;
     }
 
     @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry registry = super.createRegistry();
+        if (isUseSsl()) {
+            registry.bind("sslContextParameters", getClientSSLContextParameters());
+        }
+
+        return registry;
+    }
+
+    @Override
     public void setUp() throws Exception {
         port = AvailablePortFinder.getNextAvailable(61613);
 
@@ -51,7 +78,17 @@ public abstract class StompBaseTest extends CamelTestSupport {
             brokerService = new BrokerService();
             brokerService.setPersistent(false);
             brokerService.setAdvisorySupport(false);
-            brokerService.addConnector("stomp://localhost:" + getPort() + "?trace=true");
+
+            if (isUseSsl()) {
+                SslContext sslContext = new SslContext();
+                sslContext.setSSLContext(getServerSSLContext());
+
+                brokerService.setSslContext(sslContext);
+                brokerService.addConnector("stomp+ssl://localhost:" + getPort() + "?trace=true");
+            } else {
+                brokerService.addConnector("stomp://localhost:" + getPort() + "?trace=true");
+            }
+
             brokerService.start();
             brokerService.waitUntilStarted();
             super.setUp();
@@ -71,4 +108,67 @@ public abstract class StompBaseTest extends CamelTestSupport {
             brokerService.waitUntilStopped();
         }
     }
+
+    protected Stomp createStompClient() throws Exception {
+        Stomp stomp;
+        if (isUseSsl()) {
+            stomp = new Stomp("ssl://localhost:" + getPort());
+            stomp.setSslContext(getClientSSLContext());
+        } else {
+            stomp = new Stomp("tcp://localhost:" + getPort());
+        }
+
+        return stomp;
+    }
+
+    protected SSLContextParameters getServerSSLContextParameters()  {
+        if (serverSslContextParameters == null) {
+            serverSslContextParameters = getSSLContextParameters("jsse/server.keystore", "password");
+        }
+
+        return serverSslContextParameters;
+    }
+
+    protected SSLContext getServerSSLContext() throws Exception {
+        if (serverSslContext == null) {
+            serverSslContext = getServerSSLContextParameters().createSSLContext();
+        }
+
+        return serverSslContext;
+    }
+
+    protected SSLContextParameters getClientSSLContextParameters()  {
+        if (clientSslContextParameters == null) {
+            clientSslContextParameters = getSSLContextParameters("jsse/client.keystore", "password");
+        }
+
+        return clientSslContextParameters;
+    }
+
+    protected SSLContext getClientSSLContext() throws Exception {
+        if (clientSslContext == null) {
+            clientSslContext = getClientSSLContextParameters().createSSLContext();
+        }
+
+        return clientSslContext;
+    }
+
+    private SSLContextParameters getSSLContextParameters(String path, String password)  {
+        KeyStoreParameters ksp = new KeyStoreParameters();
+        ksp.setResource(path);
+        ksp.setPassword(password);
+
+        KeyManagersParameters kmp = new KeyManagersParameters();
+        kmp.setKeyPassword(password);
+        kmp.setKeyStore(ksp);
+
+        TrustManagersParameters tmp = new TrustManagersParameters();
+        tmp.setKeyStore(ksp);
+
+        SSLContextParameters sslContextParameters = new SSLContextParameters();
+        sslContextParameters.setKeyManagers(kmp);
+        sslContextParameters.setTrustManagers(tmp);
+
+        return sslContextParameters;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerTest.java b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerTest.java
index 22c58c9..02a349c 100644
--- a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerTest.java
+++ b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerTest.java
@@ -41,7 +41,7 @@ public class StompConsumerTest extends StompBaseTest {
         context.addRoutes(createRouteBuilder());
         context.start();
 
-        Stomp stomp = new Stomp("tcp://localhost:" + getPort());
+        Stomp stomp = createStompClient();
         final BlockingConnection producerConnection = stomp.connectBlocking();
 
         MockEndpoint mock = getMockEndpoint("mock:result");

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerUriTest.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerUriTest.java b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerUriTest.java
index 629ca2a..c9ad73d 100644
--- a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerUriTest.java
+++ b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompConsumerUriTest.java
@@ -41,7 +41,7 @@ public class StompConsumerUriTest extends StompBaseTest {
         context.addRoutes(createRouteBuilder());
         context.start();
 
-        Stomp stomp = new Stomp("tcp://localhost:" + getPort());
+        Stomp stomp = createStompClient();
         final BlockingConnection producerConnection = stomp.connectBlocking();
 
         MockEndpoint mock = getMockEndpoint("mock:result");
@@ -62,9 +62,9 @@ public class StompConsumerUriTest extends StompBaseTest {
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("stomp:queue:test?brokerURL=tcp://localhost:" + getPort())
-                        .transform(body().convertToString())
-                        .to("mock:result");
+                fromF("stomp:queue:test?brokerURL=tcp://localhost:%d", getPort())
+                    .transform(body().convertToString())
+                    .to("mock:result");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompProducerTest.java b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompProducerTest.java
index c87d2d1..c1e09dc 100644
--- a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompProducerTest.java
+++ b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompProducerTest.java
@@ -42,7 +42,7 @@ public class StompProducerTest extends StompBaseTest {
         context.addRoutes(createRouteBuilder());
         context.start();
 
-        Stomp stomp = new Stomp("tcp://localhost:" + getPort());
+        Stomp stomp = createStompClient();
         final BlockingConnection subscribeConnection = stomp.connectBlocking();
 
         StompFrame frame = new StompFrame(SUBSCRIBE);

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslConsumerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslConsumerTest.java b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslConsumerTest.java
new file mode 100644
index 0000000..bee9f4b
--- /dev/null
+++ b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslConsumerTest.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.stomp;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class StompSslConsumerTest extends StompConsumerTest {
+
+    @Override
+    protected boolean isUseSsl() {
+        return true;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                fromF("stomp:queue:test?brokerURL=ssl://localhost:%d&sslContextParameters=#sslContextParameters", getPort())
+                    .transform(body().convertToString())
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslProducerTest.java b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslProducerTest.java
new file mode 100644
index 0000000..9054216
--- /dev/null
+++ b/components/camel-stomp/src/test/java/org/apache/camel/component/stomp/StompSslProducerTest.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.stomp;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class StompSslProducerTest extends StompProducerTest {
+
+    @Override
+    protected boolean isUseSsl() {
+        return true;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:foo")
+                    .toF("stomp:queue:test?brokerURL=ssl://localhost:%d&sslContextParameters=#sslContextParameters", getPort());
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/resources/jsse/client.keystore
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/resources/jsse/client.keystore b/components/camel-stomp/src/test/resources/jsse/client.keystore
new file mode 100755
index 0000000..6ab1286
Binary files /dev/null and b/components/camel-stomp/src/test/resources/jsse/client.keystore differ

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/resources/jsse/server.keystore
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/resources/jsse/server.keystore b/components/camel-stomp/src/test/resources/jsse/server.keystore
new file mode 100755
index 0000000..b8af477
Binary files /dev/null and b/components/camel-stomp/src/test/resources/jsse/server.keystore differ

http://git-wip-us.apache.org/repos/asf/camel/blob/d3231d34/components/camel-stomp/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/camel-stomp/src/test/resources/log4j.properties b/components/camel-stomp/src/test/resources/log4j.properties
index 55f9354..d8932fa 100644
--- a/components/camel-stomp/src/test/resources/log4j.properties
+++ b/components/camel-stomp/src/test/resources/log4j.properties
@@ -18,7 +18,7 @@
 #
 # The logging properties used during tests..
 #
-log4j.rootLogger=info, file
+log4j.rootLogger=INFO, file
 
 #log4j.logger.twitter4j=DEBUG
 #log4j.logger.org.apache.camel.component.stomp=DEBUG