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");
+
}
};
}