This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 9f189ef CAMEL-16677: Move vertx SSL setup to vertx-common 9f189ef is described below commit 9f189ef34067097b40c2f5ba16192485b9ab96dd Author: James Netherton <jamesnether...@gmail.com> AuthorDate: Wed Jun 2 07:44:08 2021 +0100 CAMEL-16677: Move vertx SSL setup to vertx-common --- .../http/vertx/VertxPlatformHttpServer.java | 4 +- .../http/vertx/VertxPlatformHttpServerSupport.java | 138 +------------------- .../vertx/common/KeyManagerFactoryOptions.java | 53 ++++++++ .../vertx/common/TrustManagerFactoryOptions.java | 52 ++++++++ .../camel/component/vertx/common/VertxHelper.java | 129 +++++++++++++++++++ .../component/vertx/http/VertxHttpEndpoint.java | 3 +- .../component/vertx/http/VertxHttpHelper.java | 90 ------------- .../camel-vertx/camel-vertx-websocket/pom.xml | 4 + .../vertx/websocket/VertxWebsocketComponent.java | 4 +- .../vertx/websocket/VertxWebsocketEndpoint.java | 5 +- .../vertx/websocket/VertxWebsocketHelper.java | 141 --------------------- .../vertx/websocket/VertxWebsocketHost.java | 9 +- .../vertx/websocket/VertxWebSocketTestSupport.java | 2 +- .../VertxWebsocketExternalServerTest.java | 2 +- .../vertx/websocket/VertxWebsocketTest.java | 2 +- 15 files changed, 259 insertions(+), 379 deletions(-) diff --git a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServer.java b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServer.java index 8462ba5..73caa30 100644 --- a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServer.java +++ b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServer.java @@ -16,8 +16,6 @@ */ package org.apache.camel.component.platform.http.vertx; -import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; @@ -161,7 +159,7 @@ public class VertxPlatformHttpServer extends ServiceSupport implements CamelCont }); } - protected void startServer() throws GeneralSecurityException, IOException { + protected void startServer() throws Exception { HttpServerOptions options = new HttpServerOptions(); configureSSL(options, configuration, context); diff --git a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServerSupport.java b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServerSupport.java index c7336f1..5f8fb5b 100644 --- a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServerSupport.java +++ b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpServerSupport.java @@ -16,36 +16,23 @@ */ package org.apache.camel.component.platform.http.vertx; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.KeyStore; import java.util.Collection; import java.util.HashSet; import java.util.Set; -import java.util.function.Function; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509KeyManager; - import io.vertx.core.Handler; -import io.vertx.core.Vertx; import io.vertx.core.http.HttpHeaders; import io.vertx.core.http.HttpMethod; import io.vertx.core.http.HttpServerOptions; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; -import io.vertx.core.net.KeyCertOptions; -import io.vertx.core.net.TrustOptions; import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.handler.BodyHandler; import org.apache.camel.CamelContext; -import org.apache.camel.support.jsse.KeyManagersParameters; +import org.apache.camel.component.vertx.common.VertxHelper; import org.apache.camel.support.jsse.SSLContextParameters; -import org.apache.camel.support.jsse.TrustManagersParameters; import org.apache.camel.util.ObjectHelper; public final class VertxPlatformHttpServerSupport { @@ -169,134 +156,15 @@ public final class VertxPlatformHttpServerSupport { static HttpServerOptions configureSSL( HttpServerOptions options, VertxPlatformHttpServerConfiguration configuration, CamelContext camelContext) - throws GeneralSecurityException, IOException { + throws Exception { final SSLContextParameters sslParameters = configuration.getSslContextParameters() != null ? configuration.getSslContextParameters() : configuration.isUseGlobalSslContextParameters() ? camelContext.getSSLContextParameters() : null; if (sslParameters != null) { - options.setSsl(true); - options.setKeyCertOptions(new KeyManagerFactoryOptions(createKeyManagerFactory(camelContext, sslParameters))); - options.setTrustOptions(new TrustManagerFactoryOptions(createTrustManagerFactory(camelContext, sslParameters))); + VertxHelper.setupSSLOptions(camelContext, sslParameters, options); } return options; } - - private static class KeyManagerFactoryOptions implements KeyCertOptions { - private final KeyManagerFactory keyManagerFactory; - - public KeyManagerFactoryOptions(KeyManagerFactory keyManagerFactory) { - this.keyManagerFactory = keyManagerFactory; - } - - private KeyManagerFactoryOptions(KeyManagerFactoryOptions other) { - this.keyManagerFactory = other.keyManagerFactory; - } - - @Override - public KeyCertOptions copy() { - return new KeyManagerFactoryOptions(this); - } - - @Override - public KeyManagerFactory getKeyManagerFactory(Vertx vertx) { - return keyManagerFactory; - } - - @Override - public Function<String, X509KeyManager> keyManagerMapper(Vertx vertx) { - return keyManagerFactory.getKeyManagers()[0] instanceof X509KeyManager - ? serverName -> (X509KeyManager) keyManagerFactory.getKeyManagers()[0] : null; - } - } - - private static class TrustManagerFactoryOptions implements TrustOptions { - private final TrustManagerFactory trustManagerFactory; - - public TrustManagerFactoryOptions(TrustManagerFactory trustManagerFactory) { - this.trustManagerFactory = trustManagerFactory; - } - - private TrustManagerFactoryOptions(TrustManagerFactoryOptions other) { - trustManagerFactory = other.trustManagerFactory; - } - - @Override - public TrustOptions copy() { - return new TrustManagerFactoryOptions(this); - } - - @Override - public TrustManagerFactory getTrustManagerFactory(Vertx vertx) { - return trustManagerFactory; - } - - @Override - public Function<String, TrustManager[]> trustManagerMapper(Vertx vertx) { - return serverName -> trustManagerFactory.getTrustManagers(); - } - } - - private static KeyManagerFactory createKeyManagerFactory( - CamelContext camelContext, SSLContextParameters sslContextParameters) - throws GeneralSecurityException, IOException { - final KeyManagersParameters keyManagers = sslContextParameters.getKeyManagers(); - if (keyManagers == null) { - return null; - } - - String kmfAlgorithm = camelContext.resolvePropertyPlaceholders(keyManagers.getAlgorithm()); - if (kmfAlgorithm == null) { - kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); - } - - KeyManagerFactory kmf; - if (keyManagers.getProvider() == null) { - kmf = KeyManagerFactory.getInstance(kmfAlgorithm); - } else { - kmf = KeyManagerFactory.getInstance(kmfAlgorithm, - camelContext.resolvePropertyPlaceholders(keyManagers.getProvider())); - } - - char[] kmfPassword = null; - if (keyManagers.getKeyPassword() != null) { - kmfPassword = camelContext.resolvePropertyPlaceholders(keyManagers.getKeyPassword()).toCharArray(); - } - - KeyStore ks = keyManagers.getKeyStore() == null ? null : keyManagers.getKeyStore().createKeyStore(); - - kmf.init(ks, kmfPassword); - return kmf; - } - - private static TrustManagerFactory createTrustManagerFactory( - CamelContext camelContext, SSLContextParameters sslContextParameters) - throws GeneralSecurityException, IOException { - final TrustManagersParameters trustManagers = sslContextParameters.getTrustManagers(); - if (trustManagers == null) { - return null; - } - - TrustManagerFactory tmf = null; - - if (trustManagers.getKeyStore() != null) { - String tmfAlgorithm = camelContext.resolvePropertyPlaceholders(trustManagers.getAlgorithm()); - if (tmfAlgorithm == null) { - tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); - } - - if (trustManagers.getProvider() == null) { - tmf = TrustManagerFactory.getInstance(tmfAlgorithm); - } else { - tmf = TrustManagerFactory.getInstance(tmfAlgorithm, - camelContext.resolvePropertyPlaceholders(trustManagers.getProvider())); - } - - KeyStore ks = trustManagers.getKeyStore() == null ? null : trustManagers.getKeyStore().createKeyStore(); - tmf.init(ks); - } - - return tmf; - } } diff --git a/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/KeyManagerFactoryOptions.java b/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/KeyManagerFactoryOptions.java new file mode 100644 index 0000000..170bced --- /dev/null +++ b/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/KeyManagerFactoryOptions.java @@ -0,0 +1,53 @@ +/* + * 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.vertx.common; + +import java.util.function.Function; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.X509KeyManager; + +import io.vertx.core.Vertx; +import io.vertx.core.net.KeyCertOptions; + +public class KeyManagerFactoryOptions implements KeyCertOptions { + private final KeyManagerFactory keyManagerFactory; + + public KeyManagerFactoryOptions(KeyManagerFactory keyManagerFactory) { + this.keyManagerFactory = keyManagerFactory; + } + + private KeyManagerFactoryOptions(KeyManagerFactoryOptions other) { + this.keyManagerFactory = other.keyManagerFactory; + } + + @Override + public KeyCertOptions copy() { + return new KeyManagerFactoryOptions(this); + } + + @Override + public KeyManagerFactory getKeyManagerFactory(Vertx vertx) { + return keyManagerFactory; + } + + @Override + public Function<String, X509KeyManager> keyManagerMapper(Vertx vertx) { + return keyManagerFactory.getKeyManagers()[0] instanceof X509KeyManager + ? serverName -> (X509KeyManager) keyManagerFactory.getKeyManagers()[0] : null; + } +} diff --git a/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/TrustManagerFactoryOptions.java b/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/TrustManagerFactoryOptions.java new file mode 100644 index 0000000..cedd626 --- /dev/null +++ b/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/TrustManagerFactoryOptions.java @@ -0,0 +1,52 @@ +/* + * 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.vertx.common; + +import java.util.function.Function; + +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; + +import io.vertx.core.Vertx; +import io.vertx.core.net.TrustOptions; + +public class TrustManagerFactoryOptions implements TrustOptions { + private final TrustManagerFactory trustManagerFactory; + + public TrustManagerFactoryOptions(TrustManagerFactory trustManagerFactory) { + this.trustManagerFactory = trustManagerFactory; + } + + private TrustManagerFactoryOptions(TrustManagerFactoryOptions other) { + trustManagerFactory = other.trustManagerFactory; + } + + @Override + public TrustOptions copy() { + return new TrustManagerFactoryOptions(this); + } + + @Override + public TrustManagerFactory getTrustManagerFactory(Vertx vertx) { + return trustManagerFactory; + } + + @Override + public Function<String, TrustManager[]> trustManagerMapper(Vertx vertx) { + return serverName -> trustManagerFactory.getTrustManagers(); + } +} diff --git a/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/VertxHelper.java b/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/VertxHelper.java new file mode 100644 index 0000000..edf4e1c --- /dev/null +++ b/components/camel-vertx/camel-vertx-common/src/main/java/org/apache/camel/component/vertx/common/VertxHelper.java @@ -0,0 +1,129 @@ +/* + * 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.vertx.common; + +import java.security.KeyStore; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.TrustManagerFactory; + +import io.vertx.core.net.TCPSSLOptions; +import org.apache.camel.CamelContext; +import org.apache.camel.support.jsse.KeyManagersParameters; +import org.apache.camel.support.jsse.SSLContextParameters; +import org.apache.camel.support.jsse.TrustManagersParameters; + +public final class VertxHelper { + + private VertxHelper() { + // Utility class + } + + /** + * Configures key store and trust store options for the given TCPSSLOptions from the configuration specified on + * SSLContextParameters + * + * @param camelContext the CamelContext + * @param sslContextParameters the SSL configuration to use for the KeyManagerFactory & TrustManagerFactory + * @param tcpsslOptions the TCPSSLOptions instance to configure + */ + public static void setupSSLOptions( + CamelContext camelContext, SSLContextParameters sslContextParameters, TCPSSLOptions tcpsslOptions) + throws Exception { + + if (camelContext == null) { + throw new IllegalArgumentException("camelContext cannot be null"); + } + + if (sslContextParameters == null) { + throw new IllegalArgumentException("sslContextParameters cannot be null"); + } + + if (tcpsslOptions == null) { + throw new IllegalArgumentException("tcpsslOptions cannot be null"); + } + + tcpsslOptions.setSsl(true); + + KeyManagerFactory keyManagerFactory = createKeyManagerFactory(camelContext, sslContextParameters); + tcpsslOptions.setKeyCertOptions(new KeyManagerFactoryOptions(keyManagerFactory)); + + TrustManagerFactory trustManagerFactory = createTrustManagerFactory(camelContext, sslContextParameters); + tcpsslOptions.setTrustOptions(new TrustManagerFactoryOptions(trustManagerFactory)); + } + + private static KeyManagerFactory createKeyManagerFactory( + CamelContext camelContext, SSLContextParameters sslContextParameters) + throws Exception { + final KeyManagersParameters keyManagers = sslContextParameters.getKeyManagers(); + if (keyManagers == null) { + return null; + } + + String kmfAlgorithm = camelContext.resolvePropertyPlaceholders(keyManagers.getAlgorithm()); + if (kmfAlgorithm == null) { + kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); + } + + KeyManagerFactory kmf; + if (keyManagers.getProvider() == null) { + kmf = KeyManagerFactory.getInstance(kmfAlgorithm); + } else { + kmf = KeyManagerFactory.getInstance(kmfAlgorithm, + camelContext.resolvePropertyPlaceholders(keyManagers.getProvider())); + } + + char[] kmfPassword = null; + if (keyManagers.getKeyPassword() != null) { + kmfPassword = camelContext.resolvePropertyPlaceholders(keyManagers.getKeyPassword()).toCharArray(); + } + + KeyStore ks = keyManagers.getKeyStore() == null ? null : keyManagers.getKeyStore().createKeyStore(); + + kmf.init(ks, kmfPassword); + return kmf; + } + + private static TrustManagerFactory createTrustManagerFactory( + CamelContext camelContext, SSLContextParameters sslContextParameters) + throws Exception { + final TrustManagersParameters trustManagers = sslContextParameters.getTrustManagers(); + if (trustManagers == null) { + return null; + } + + TrustManagerFactory tmf = null; + + if (trustManagers.getKeyStore() != null) { + String tmfAlgorithm = camelContext.resolvePropertyPlaceholders(trustManagers.getAlgorithm()); + if (tmfAlgorithm == null) { + tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); + } + + if (trustManagers.getProvider() == null) { + tmf = TrustManagerFactory.getInstance(tmfAlgorithm); + } else { + tmf = TrustManagerFactory.getInstance(tmfAlgorithm, + camelContext.resolvePropertyPlaceholders(trustManagers.getProvider())); + } + + KeyStore ks = trustManagers.getKeyStore() == null ? null : trustManagers.getKeyStore().createKeyStore(); + tmf.init(ks); + } + return tmf; + } +} diff --git a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java index 5c49105..76b98da 100644 --- a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java +++ b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java @@ -26,6 +26,7 @@ import org.apache.camel.Category; import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.component.vertx.common.VertxHelper; import org.apache.camel.http.base.HttpHelper; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -88,7 +89,7 @@ public class VertxHttpEndpoint extends DefaultEndpoint { SSLContextParameters sslContextParameters = configuration.getSslContextParameters(); if (sslContextParameters != null) { - VertxHttpHelper.setupSSLOptions(sslContextParameters, options); + VertxHelper.setupSSLOptions(getCamelContext(), sslContextParameters, options); } webClient = WebClient.create(getVertx(), options); diff --git a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java index 63aedb7..a691f64 100644 --- a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java +++ b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java @@ -23,21 +23,11 @@ import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; -import java.security.KeyStore; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManagerFactory; - -import io.vertx.core.Vertx; -import io.vertx.core.net.KeyStoreOptions; -import io.vertx.core.net.TCPSSLOptions; import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; import org.apache.camel.Message; import org.apache.camel.http.base.HttpHelper; -import org.apache.camel.support.jsse.KeyManagersParameters; -import org.apache.camel.support.jsse.SSLContextParameters; -import org.apache.camel.support.jsse.TrustManagersParameters; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.UnsafeUriCharactersEncoder; @@ -49,25 +39,6 @@ public final class VertxHttpHelper { } /** - * Configures key store and trust store options for the Vert.x client and server - */ - public static void setupSSLOptions(SSLContextParameters sslContextParameters, TCPSSLOptions options) { - options.setSsl(true); - options.setKeyCertOptions(new KeyStoreOptions() { - @Override - public KeyManagerFactory getKeyManagerFactory(Vertx vertx) throws Exception { - return createKeyManagerFactory(sslContextParameters); - } - }); - options.setTrustOptions(new KeyStoreOptions() { - @Override - public TrustManagerFactory getTrustManagerFactory(Vertx vertx) throws Exception { - return createTrustManagerFactory(sslContextParameters); - } - }); - } - - /** * Resolves a HTTP URI query string from the given exchange message headers */ public static String resolveQueryString(Exchange exchange) throws URISyntaxException { @@ -175,65 +146,4 @@ public final class VertxHttpHelper { } return charset; } - - /** - * Creates a KeyManagerFactory from a given SSLContextParameters - */ - private static KeyManagerFactory createKeyManagerFactory(SSLContextParameters sslContextParameters) throws Exception { - final KeyManagersParameters keyManagers = sslContextParameters.getKeyManagers(); - if (keyManagers == null) { - return null; - } - - String kmfAlgorithm = keyManagers.getAlgorithm(); - if (kmfAlgorithm == null) { - kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); - } - - KeyManagerFactory kmf; - if (keyManagers.getProvider() == null) { - kmf = KeyManagerFactory.getInstance(kmfAlgorithm); - } else { - kmf = KeyManagerFactory.getInstance(kmfAlgorithm, keyManagers.getProvider()); - } - - char[] kmfPassword = null; - if (keyManagers.getKeyPassword() != null) { - kmfPassword = keyManagers.getKeyPassword().toCharArray(); - } - - KeyStore ks = keyManagers.getKeyStore() == null ? null : keyManagers.getKeyStore().createKeyStore(); - - kmf.init(ks, kmfPassword); - return kmf; - } - - /** - * Creates a TrustManagerFactory from a given SSLContextParameters - */ - private static TrustManagerFactory createTrustManagerFactory(SSLContextParameters sslContextParameters) throws Exception { - final TrustManagersParameters trustManagers = sslContextParameters.getTrustManagers(); - if (trustManagers == null) { - return null; - } - - TrustManagerFactory tmf = null; - - if (trustManagers.getKeyStore() != null) { - String tmfAlgorithm = trustManagers.getAlgorithm(); - if (tmfAlgorithm == null) { - tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); - } - - if (trustManagers.getProvider() == null) { - tmf = TrustManagerFactory.getInstance(tmfAlgorithm); - } else { - tmf = TrustManagerFactory.getInstance(tmfAlgorithm, trustManagers.getProvider()); - } - - KeyStore ks = trustManagers.getKeyStore() == null ? null : trustManagers.getKeyStore().createKeyStore(); - tmf.init(ks); - } - return tmf; - } } diff --git a/components/camel-vertx/camel-vertx-websocket/pom.xml b/components/camel-vertx/camel-vertx-websocket/pom.xml index a3d7e1b..e5bcf5f 100644 --- a/components/camel-vertx/camel-vertx-websocket/pom.xml +++ b/components/camel-vertx/camel-vertx-websocket/pom.xml @@ -40,6 +40,10 @@ <artifactId>camel-support</artifactId> </dependency> <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-vertx-common</artifactId> + </dependency> + <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-web</artifactId> <version>${vertx-version}</version> diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketComponent.java b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketComponent.java index 0561d8e..a25e819 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketComponent.java +++ b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketComponent.java @@ -195,12 +195,12 @@ public class VertxWebsocketComponent extends DefaultComponent implements SSLCont this.useGlobalSslContextParameters = useGlobalSslContextParameters; } - protected Map<VertxWebsocketHostKey, VertxWebsocketHost> getVerxHostRegistry() { + protected Map<VertxWebsocketHostKey, VertxWebsocketHost> getVertxHostRegistry() { return this.vertxHostRegistry; } protected VertxWebsocketHost createVertxWebsocketHost( VertxWebsocketHostConfiguration hostConfiguration, VertxWebsocketHostKey hostKey) { - return new VertxWebsocketHost(hostConfiguration, hostKey); + return new VertxWebsocketHost(getCamelContext(), hostConfiguration, hostKey); } } diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java index 9d59a1d..c414395 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java +++ b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java @@ -32,6 +32,7 @@ import org.apache.camel.Consumer; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.component.vertx.common.VertxHelper; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; import org.apache.camel.support.DefaultEndpoint; @@ -101,7 +102,7 @@ public class VertxWebsocketEndpoint extends DefaultEndpoint { SSLContextParameters sslContextParameters = configuration.getSslContextParameters(); if (sslContextParameters != null) { - VertxWebsocketHelper.setupSSLOptions(sslContextParameters, options); + VertxHelper.setupSSLOptions(getCamelContext(), sslContextParameters, options); } client = getVertx().createHttpClient(options); @@ -134,7 +135,7 @@ public class VertxWebsocketEndpoint extends DefaultEndpoint { } protected Map<VertxWebsocketHostKey, VertxWebsocketHost> getVertxHostRegistry() { - return getComponent().getVerxHostRegistry(); + return getComponent().getVertxHostRegistry(); } /** diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHelper.java b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHelper.java index 4592b9d..b0998ae 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHelper.java +++ b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHelper.java @@ -16,22 +16,6 @@ */ package org.apache.camel.component.vertx.websocket; -import java.security.KeyStore; -import java.util.function.Function; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509KeyManager; - -import io.vertx.core.Vertx; -import io.vertx.core.net.KeyCertOptions; -import io.vertx.core.net.TCPSSLOptions; -import io.vertx.core.net.TrustOptions; -import org.apache.camel.support.jsse.KeyManagersParameters; -import org.apache.camel.support.jsse.SSLContextParameters; -import org.apache.camel.support.jsse.TrustManagersParameters; - public final class VertxWebsocketHelper { private VertxWebsocketHelper() { @@ -39,70 +23,6 @@ public final class VertxWebsocketHelper { } /** - * Configures key store and trust store options for the Vert.x client and server - */ - public static void setupSSLOptions(SSLContextParameters sslContextParameters, TCPSSLOptions options) throws Exception { - options.setSsl(true); - options.setKeyCertOptions(new KeyManagerFactoryOptions(createKeyManagerFactory(sslContextParameters))); - options.setTrustOptions(new TrustManagerFactoryOptions(createTrustManagerFactory(sslContextParameters))); - } - - private static class KeyManagerFactoryOptions implements KeyCertOptions { - private final KeyManagerFactory keyManagerFactory; - - public KeyManagerFactoryOptions(KeyManagerFactory keyManagerFactory) { - this.keyManagerFactory = keyManagerFactory; - } - - private KeyManagerFactoryOptions(KeyManagerFactoryOptions other) { - this.keyManagerFactory = other.keyManagerFactory; - } - - @Override - public KeyCertOptions copy() { - return new KeyManagerFactoryOptions(this); - } - - @Override - public KeyManagerFactory getKeyManagerFactory(Vertx vertx) { - return keyManagerFactory; - } - - @Override - public Function<String, X509KeyManager> keyManagerMapper(Vertx vertx) { - return keyManagerFactory.getKeyManagers()[0] instanceof X509KeyManager - ? serverName -> (X509KeyManager) keyManagerFactory.getKeyManagers()[0] : null; - } - } - - private static class TrustManagerFactoryOptions implements TrustOptions { - private final TrustManagerFactory trustManagerFactory; - - public TrustManagerFactoryOptions(TrustManagerFactory trustManagerFactory) { - this.trustManagerFactory = trustManagerFactory; - } - - private TrustManagerFactoryOptions(TrustManagerFactoryOptions other) { - trustManagerFactory = other.trustManagerFactory; - } - - @Override - public TrustOptions copy() { - return new TrustManagerFactoryOptions(this); - } - - @Override - public TrustManagerFactory getTrustManagerFactory(Vertx vertx) { - return trustManagerFactory; - } - - @Override - public Function<String, TrustManager[]> trustManagerMapper(Vertx vertx) { - return serverName -> trustManagerFactory.getTrustManagers(); - } - } - - /** * Extracts the port number from the endpoint URI path or returns the Vert.x default HTTP server port (0) if one was * not provided */ @@ -157,65 +77,4 @@ public final class VertxWebsocketHelper { public static VertxWebsocketHostKey createHostKey(VertxWebsocketConfiguration configuration) { return new VertxWebsocketHostKey(configuration.getHost(), configuration.getPort()); } - - /** - * Creates a KeyManagerFactory from a given SSLContextParameters - */ - private static KeyManagerFactory createKeyManagerFactory(SSLContextParameters sslContextParameters) throws Exception { - final KeyManagersParameters keyManagers = sslContextParameters.getKeyManagers(); - if (keyManagers == null) { - return null; - } - - String kmfAlgorithm = keyManagers.getAlgorithm(); - if (kmfAlgorithm == null) { - kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); - } - - KeyManagerFactory kmf; - if (keyManagers.getProvider() == null) { - kmf = KeyManagerFactory.getInstance(kmfAlgorithm); - } else { - kmf = KeyManagerFactory.getInstance(kmfAlgorithm, keyManagers.getProvider()); - } - - char[] kmfPassword = null; - if (keyManagers.getKeyPassword() != null) { - kmfPassword = keyManagers.getKeyPassword().toCharArray(); - } - - KeyStore ks = keyManagers.getKeyStore() == null ? null : keyManagers.getKeyStore().createKeyStore(); - - kmf.init(ks, kmfPassword); - return kmf; - } - - /** - * Creates a TrustManagerFactory from a given SSLContextParameters - */ - private static TrustManagerFactory createTrustManagerFactory(SSLContextParameters sslContextParameters) throws Exception { - final TrustManagersParameters trustManagers = sslContextParameters.getTrustManagers(); - if (trustManagers == null) { - return null; - } - - TrustManagerFactory tmf = null; - - if (trustManagers.getKeyStore() != null) { - String tmfAlgorithm = trustManagers.getAlgorithm(); - if (tmfAlgorithm == null) { - tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); - } - - if (trustManagers.getProvider() == null) { - tmf = TrustManagerFactory.getInstance(tmfAlgorithm); - } else { - tmf = TrustManagerFactory.getInstance(tmfAlgorithm, trustManagers.getProvider()); - } - - KeyStore ks = trustManagers.getKeyStore() == null ? null : trustManagers.getKeyStore().createKeyStore(); - tmf.init(ks); - } - return tmf; - } } diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHost.java b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHost.java index 9fb9490..16dc263 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHost.java +++ b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketHost.java @@ -33,6 +33,8 @@ import io.vertx.core.net.SocketAddress; import io.vertx.ext.web.Route; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.CorsHandler; +import org.apache.camel.CamelContext; +import org.apache.camel.component.vertx.common.VertxHelper; import org.apache.camel.support.jsse.SSLContextParameters; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; @@ -48,10 +50,13 @@ public class VertxWebsocketHost { private final VertxWebsocketHostKey hostKey; private final Map<String, Route> routeRegistry = new HashMap<>(); private final Map<String, ServerWebSocket> connectedPeers = new ConcurrentHashMap<>(); + private final CamelContext camelContext; private HttpServer server; private int port = VertxWebsocketConstants.DEFAULT_VERTX_SERVER_PORT; - public VertxWebsocketHost(VertxWebsocketHostConfiguration websocketHostConfiguration, VertxWebsocketHostKey key) { + public VertxWebsocketHost(CamelContext camelContext, VertxWebsocketHostConfiguration websocketHostConfiguration, + VertxWebsocketHostKey key) { + this.camelContext = camelContext; this.hostConfiguration = websocketHostConfiguration; this.hostKey = key; } @@ -161,7 +166,7 @@ public class VertxWebsocketHost { options = new HttpServerOptions(); } - VertxWebsocketHelper.setupSSLOptions(sslContextParameters, options); + VertxHelper.setupSSLOptions(camelContext, sslContextParameters, options); } if (options != null) { diff --git a/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebSocketTestSupport.java b/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebSocketTestSupport.java index b9ba631..32b159f 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebSocketTestSupport.java +++ b/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebSocketTestSupport.java @@ -41,7 +41,7 @@ public class VertxWebSocketTestSupport extends CamelTestSupport { */ public int getVertxServerRandomPort() { VertxWebsocketComponent component = context.getComponent("vertx-websocket", VertxWebsocketComponent.class); - Map<VertxWebsocketHostKey, VertxWebsocketHost> registry = component.getVerxHostRegistry(); + Map<VertxWebsocketHostKey, VertxWebsocketHost> registry = component.getVertxHostRegistry(); return registry.values() .stream() .filter(wsHost -> wsHost.getPort() != port) diff --git a/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketExternalServerTest.java b/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketExternalServerTest.java index b286ea5..54589a0 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketExternalServerTest.java +++ b/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketExternalServerTest.java @@ -98,7 +98,7 @@ public class VertxWebsocketExternalServerTest extends VertxWebSocketTestSupport VertxWebsocketHostConfiguration configuration = new VertxWebsocketHostConfiguration(vertx, router, options, null); VertxWebsocketHostKey key = new VertxWebsocketHostKey("localhost", 0); - VertxWebsocketHost host = new VertxWebsocketHost(configuration, key); + VertxWebsocketHost host = new VertxWebsocketHost(context, configuration, key); host.start(); CamelContext context = new DefaultCamelContext(); diff --git a/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketTest.java b/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketTest.java index 11f456e..3fcd5e9 100644 --- a/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketTest.java +++ b/components/camel-vertx/camel-vertx-websocket/src/test/java/org/apache/camel/component/vertx/websocket/VertxWebsocketTest.java @@ -218,7 +218,7 @@ public class VertxWebsocketTest extends VertxWebSocketTestSupport { List<String> results = new ArrayList<>(); VertxWebsocketComponent component = context.getComponent("vertx-websocket", VertxWebsocketComponent.class); - Map<VertxWebsocketHostKey, VertxWebsocketHost> registry = component.getVerxHostRegistry(); + Map<VertxWebsocketHostKey, VertxWebsocketHost> registry = component.getVertxHostRegistry(); VertxWebsocketHost host = registry.values() .stream() .filter(wsHost -> wsHost.getPort() != port)