You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by co...@apache.org on 2019/05/03 10:59:38 UTC

[camel] 01/02: CAMEL-13471 - Added TLS + TCP support

This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e650ce4ce422edfcc25175905a8d5a89c05ca65e
Author: Colm O hEigeartaigh <co...@apache.org>
AuthorDate: Fri May 3 10:21:54 2019 +0100

    CAMEL-13471 - Added TLS + TCP support
---
 .../java/org/apache/camel/coap/CoAPComponent.java  | 25 ++++++++++++++++++++--
 .../java/org/apache/camel/coap/CoAPEndpoint.java   |  6 +++---
 .../java/org/apache/camel/coap/CoAPProducer.java   | 17 +++++++++++++--
 .../apache/camel/coap/CoAPComponentTLSTest.java    | 21 ++++++++++++++++++
 4 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
index 2f0b2dc..b82b323 100644
--- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
+++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
@@ -18,11 +18,14 @@ package org.apache.camel.coap;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.security.GeneralSecurityException;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.net.ssl.SSLContext;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.Consumer;
 import org.apache.camel.Endpoint;
@@ -39,6 +42,7 @@ import org.eclipse.californium.core.CoapServer;
 import org.eclipse.californium.core.network.CoapEndpoint;
 import org.eclipse.californium.core.network.config.NetworkConfig;
 import org.eclipse.californium.elements.tcp.TcpServerConnector;
+import org.eclipse.californium.elements.tcp.TlsServerConnector;
 import org.eclipse.californium.scandium.DTLSConnector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,7 +60,7 @@ public class CoAPComponent extends DefaultComponent implements RestConsumerFacto
     public CoAPComponent() {
     }
 
-    public synchronized CoapServer getServer(int port, CoAPEndpoint endpoint) throws IOException {
+    public synchronized CoapServer getServer(int port, CoAPEndpoint endpoint) throws IOException, GeneralSecurityException {
         CoapServer server = servers.get(port);
         if (server == null && port == -1) {
             server = getServer(DEFAULT_PORT, endpoint);
@@ -74,7 +78,24 @@ public class CoAPComponent extends DefaultComponent implements RestConsumerFacto
             } else if (CoAPEndpoint.enableTCP(endpoint.getUri())) {
                 int tcpThreads = config.getInt(NetworkConfig.Keys.TCP_WORKER_THREADS);
                 int tcpIdleTimeout = config.getInt(NetworkConfig.Keys.TCP_CONNECTION_IDLE_TIMEOUT);
-                TcpServerConnector tcpConnector = new TcpServerConnector(address, tcpThreads, tcpIdleTimeout);
+
+                TcpServerConnector tcpConnector = null;
+                // TLS + TCP
+                if (endpoint.getUri().getScheme().startsWith("coaps")) {
+                    int tlsHandshakeTimeout = config.getInt(NetworkConfig.Keys.TLS_HANDSHAKE_TIMEOUT);
+
+                    SSLContext sslContext = endpoint.getSslContextParameters().createSSLContext(getCamelContext());
+                    TlsServerConnector.ClientAuthMode clientAuthMode = TlsServerConnector.ClientAuthMode.NONE;
+                    if (endpoint.isClientAuthenticationRequired()) {
+                        clientAuthMode = TlsServerConnector.ClientAuthMode.NEEDED;
+                    } else if (endpoint.isClientAuthenticationWanted()) {
+                        clientAuthMode = TlsServerConnector.ClientAuthMode.WANTED;
+                    }
+                    tcpConnector =
+                        new TlsServerConnector(sslContext, clientAuthMode, address, tcpThreads, tlsHandshakeTimeout, tcpIdleTimeout);
+                } else {
+                    tcpConnector = new TcpServerConnector(address, tcpThreads, tcpIdleTimeout);
+                }
                 coapBuilder.setConnector(tcpConnector);
             } else {
                 coapBuilder.setInetSocketAddress(address);
diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java
index 04d67ae..d940ca1 100644
--- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java
+++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java
@@ -126,7 +126,7 @@ public class CoAPEndpoint extends DefaultEndpoint {
         return uri;
     }
 
-    public CoapServer getCoapServer() throws IOException {
+    public CoapServer getCoapServer() throws IOException, GeneralSecurityException {
         return component.getServer(getUri().getPort(), this);
     }
 
@@ -270,7 +270,7 @@ public class CoAPEndpoint extends DefaultEndpoint {
         this.clientAuthentication = clientAuthentication;
     }
 
-    private boolean isClientAuthenticationRequired() {
+    public boolean isClientAuthenticationRequired() {
         String clientAuth = clientAuthentication;
         if (clientAuth == null && sslContextParameters != null && sslContextParameters.getServerParameters() != null) {
             clientAuth = sslContextParameters.getServerParameters().getClientAuthentication();
@@ -279,7 +279,7 @@ public class CoAPEndpoint extends DefaultEndpoint {
         return clientAuth != null && ClientAuthentication.valueOf(clientAuth) == ClientAuthentication.REQUIRE;
     }
 
-    private boolean isClientAuthenticationWanted() {
+    public boolean isClientAuthenticationWanted() {
         String clientAuth = clientAuthentication;
         if (clientAuth == null && sslContextParameters != null && sslContextParameters.getServerParameters() != null) {
             clientAuth = sslContextParameters.getServerParameters().getClientAuthentication();
diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java
index 8e001e1..5b834da 100644
--- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java
+++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java
@@ -18,6 +18,9 @@ package org.apache.camel.coap;
 
 import java.io.IOException;
 import java.net.URI;
+import java.security.GeneralSecurityException;
+
+import javax.net.ssl.SSLContext;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -28,6 +31,7 @@ import org.eclipse.californium.core.coap.MediaTypeRegistry;
 import org.eclipse.californium.core.network.CoapEndpoint;
 import org.eclipse.californium.core.network.config.NetworkConfig;
 import org.eclipse.californium.elements.tcp.TcpClientConnector;
+import org.eclipse.californium.elements.tcp.TlsClientConnector;
 import org.eclipse.californium.scandium.DTLSConnector;
 
 /**
@@ -89,7 +93,7 @@ public class CoAPProducer extends DefaultProducer {
         }
     }
 
-    private synchronized CoapClient getClient(Exchange exchange) throws IOException {
+    private synchronized CoapClient getClient(Exchange exchange) throws IOException, GeneralSecurityException {
         if (client == null) {
             URI uri = exchange.getIn().getHeader(CoAPConstants.COAP_URI, URI.class);
             if (uri == null) {
@@ -109,7 +113,16 @@ public class CoAPProducer extends DefaultProducer {
                 int tcpThreads = config.getInt(NetworkConfig.Keys.TCP_WORKER_THREADS);
                 int tcpConnectTimeout = config.getInt(NetworkConfig.Keys.TCP_CONNECT_TIMEOUT);
                 int tcpIdleTimeout = config.getInt(NetworkConfig.Keys.TCP_CONNECTION_IDLE_TIMEOUT);
-                TcpClientConnector tcpConnector = new TcpClientConnector(tcpThreads, tcpConnectTimeout, tcpIdleTimeout);
+                TcpClientConnector tcpConnector = null;
+
+                // TLS + TCP
+                if (endpoint.getUri().getScheme().startsWith("coaps")) {
+                    SSLContext sslContext = endpoint.getSslContextParameters().createSSLContext(endpoint.getCamelContext());
+                    tcpConnector = new TlsClientConnector(sslContext, tcpThreads, tcpConnectTimeout, tcpIdleTimeout);
+                } else {
+                    tcpConnector = new TcpClientConnector(tcpThreads, tcpConnectTimeout, tcpIdleTimeout);
+                }
+
                 CoapEndpoint.Builder tcpBuilder = new CoapEndpoint.Builder();
                 tcpBuilder.setConnector(tcpConnector);
 
diff --git a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java
index 058ac66..1257b66 100644
--- a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java
+++ b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java
@@ -53,6 +53,7 @@ public class CoAPComponentTLSTest extends CamelTestSupport {
     private static final int PORT6 = AvailablePortFinder.getNextAvailable();
     private static final int PORT7 = AvailablePortFinder.getNextAvailable();
     private static final int PORT8 = AvailablePortFinder.getNextAvailable();
+    private static final int PORT9 = AvailablePortFinder.getNextAvailable();
 
     @Test
     public void testSuccessfulCall() throws Exception {
@@ -193,6 +194,18 @@ public class CoAPComponentTLSTest extends CamelTestSupport {
         assertMockEndpointsSatisfied();
     }
 
+    @Test
+    public void testTCP() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedBodiesReceived("Hello Camel CoAP");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, MediaTypeRegistry.toString(MediaTypeRegistry.APPLICATION_OCTET_STREAM));
+        mock.expectedHeaderReceived(CoAPConstants.COAP_RESPONSE_CODE, CoAP.ResponseCode.CONTENT.toString());
+        sendBodyAndHeader("direct:tcp", "Camel CoAP", CoAPConstants.COAP_METHOD, "POST");
+        assertMockEndpointsSatisfied();
+    }
+
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
 
@@ -226,6 +239,9 @@ public class CoAPComponentTLSTest extends CamelTestSupport {
                 fromF("coaps://localhost:%d/TestResource?sslContextParameters=#serviceSSLContextParameters&pskStore=#pskStore", PORT8)
                     .transform(body().prepend("Hello "));
 
+                fromF("coaps+tcp://localhost:%d/TestResource?sslContextParameters=#serviceSSLContextParameters", PORT9)
+                     .transform(body().prepend("Hello "));
+
                 from("direct:start")
                     .toF("coaps://localhost:%d/TestResource?sslContextParameters=#clientSSLContextParameters", PORT)
                     .to("mock:result");
@@ -281,6 +297,11 @@ public class CoAPComponentTLSTest extends CamelTestSupport {
                 from("direct:pskx509")
                     .toF("coaps://localhost:%d/TestResource?pskStore=#pskStore&sslContextParameters=#clientSSLContextParameters", PORT8)
                     .to("mock:result");
+
+                from("direct:tcp")
+                    .toF("coaps+tcp://localhost:%d/TestResource?sslContextParameters=#clientSSLContextParameters", PORT9)
+                    .to("mock:result");
+
             }
         };
     }