This is an automated email from the ASF dual-hosted git repository. cdeppisch 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 a82cb2d3725 CAMEL-21358: Add Knative Http SSL client options a82cb2d3725 is described below commit a82cb2d3725f9eb761a704644eee8d8d029e08da Author: Christoph Deppisch <cdeppi...@redhat.com> AuthorDate: Wed Oct 23 14:22:41 2024 +0200 CAMEL-21358: Add Knative Http SSL client options - Provide Http client options to easily connect with SSL secured Knative broker - Support keystore and truststore in different formats (jks, p12, pem) - Support multiple key and trust certificates - Support autoconfiguration of client options via system property and environment variable property binding - Support bean lookup of client options via Camel context - Improve Knative component docs - Add Knative Http transport docs --- .../src/main/docs/knative-component.adoc | 212 ++++++++++++++- .../src/main/docs/knative-http.adoc | 155 ++++++++++- .../knative/http/KnativeHttpClientOptions.java | 298 +++++++++++++++++++++ .../knative/http/KnativeHttpProducer.java | 4 + .../knative/http/KnativeHttpProducerFactory.java | 5 + .../component/knative/http/KnativeHttpSupport.java | 17 ++ .../component/knative/http/TrustAllOptions.java | 98 +++++++ .../component/knative/http/KnativeHttpServer.java | 7 +- .../component/knative/http/KnativeHttpTest.java | 243 ++++++++++++++++- .../component/knative/http/KnativeHttpsServer.java | 72 +++++ .../src/test/resources/keystore/client.crt | 33 +++ .../src/test/resources/keystore/client.jks | Bin 0 -> 6014 bytes .../src/test/resources/keystore/client.p12 | Bin 0 -> 4387 bytes .../src/test/resources/keystore/client.pem | 85 ++++++ .../src/test/resources/keystore/server.crt | 33 +++ .../src/test/resources/keystore/server.pem | 85 ++++++ .../src/test/resources/keystore/truststore.jks | Bin 0 -> 1531 bytes pom.xml | 1 + 18 files changed, 1336 insertions(+), 12 deletions(-) diff --git a/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc b/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc index ec1759801c6..881108d9921 100644 --- a/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc +++ b/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc @@ -25,7 +25,7 @@ for this component. <groupId>org.apache.camel</groupId> <artifactId>camel-knative</artifactId> <version>x.x.x</version> - <!-- use the same version as your Camel K version --> + <!-- use the same version as your Camel version --> </dependency> ------------------------------------------------------------ @@ -137,13 +137,21 @@ RouteBuilder.addRoutes(context, b -> { <1> set the location of the `Knative Environment` file <2> expose knative service -=== Using custom Knative Transport +You can also use property based component configuration to set the `Knative Environment` configuration file. -As today the component only support `http` as transport as it is the only supported protocol on Knative side but the transport is pluggable by implementing the following interface: +.application.properties +[source,properties] +---- +camel.component.knative.environmentPath=classpath:knative.json +---- + +=== Using custom Knative transports + +As today the Knative component only supports `http` as transport as this is the only supported protocol on Knative side. +The transport implementation is pluggable though by implementing the following interface: [source,java] ---- - public interface KnativeTransport extends Service { /** * Create a camel {@link org.apache.camel.Producer} in place of the original endpoint for a specific protocol. @@ -171,6 +179,132 @@ public interface KnativeTransport extends Service { } ---- +== Knative eventing + +With https://knative.dev/docs/eventing/[Knative eventing] you have the opportunity to produce/consume events on the Knative broker. + +=== Producing events + +The Apache Camel route is able to produce events by sending requests to the Knative broker. +In the Camel route you need to use the `event` resource for this kind of interaction with the Knative eventing broker. +Configure the Knative component with following `Knative Environment` configuration. + +.knative.json +[source,json] +---- +{ + "resources": [ + { + "name": "default", + "type": "event", + "endpointKind": "sink", + "url": "http://default-broker.some-namespace.svc.cluster.local", + "objectApiVersion": "eventing.knative.dev/v1", + "objectKind": "Broker", + "objectName": "default" + } + ] +} +---- + +The `Knative Environment` configuration is set on the Knative component and specifies the Knative broker URL. +You can then use the `event` resource type in your Camel route to send data to the Knative broker. + +.Example +[source,java] +---- +CamelContext context = new DefaultCamelContext(); + +KnativeComponent component = context.getComponent("knative", KnativeComponent.class); +component.getConfiguration().setEnvironmentPath("classpath:knative.json"); // <1> + +RouteBuilder.addRoutes(context, b -> { + b.from("timer:tick") + .setBody() + .simple("Hello Knative!") + .transform(new DataType("http:application-cloudevents")) // <2> + .to("knative:event/default?kind=Broker&name=default"); // <3> +}); +---- +<1> configure the Knative component to use the `Knative Environment` file +<2> transform data to proper Http CloudEvents format +<3> push event to the broker that gets resolved via the `Knative Environment` + +The Knative eventing broker uses CloudEvents data format by default. +This is why we transform the data with the given data type before sending the request to the broker. +The data type will set proper CloudEvent attributes like event type, id, source, subject and so on. + +You can customize the CloudEvent attributes by setting specific message headers (e.g. `CamelCloudEventID=myEventId` or `CamelCloudEventType=myEventType`). + +Also, you may set the CloudEvent attributes via property based configuration on the Knative component. + +.application.properties +[source,properties] +---- +camel.component.knative.ceOverride[ce-type]=dev.knative.connector.event.timer +camel.component.knative.ceOverride[ce-source]=dev.knative.eventing.timer-source +camel.component.knative.ceOverride[ce-subject]=timer +---- + +=== SinkBinding + +As an alternative to specifying the Knative broker URL statically in the +`Knative Environment` configuration you can leverage the concept of a `SinkBinding` resource that is able to inject the broker URL as an environment variable named `K_SINK`. + +The SinkBinding is a Kubernetes resource that makes Knative eventing automatically inject the resource URL into your Camel application on startup. +The real Knative broker URL will be available in the form of the environment varoable `K_SINK`. + +You can use property binding support to resolve this environment variable in the Knative component configuration: + +.knative.json +[source,json] +---- +{ + "resources": [ + { + "name": "default", + "type": "event", + "endpointKind": "sink", + "url": "{{k.sink}}", + "objectApiVersion": "eventing.knative.dev/v1", + "objectKind": "Broker", + "objectName": "default" + } + ] +} +---- + +As you can see the `Knative Environment` configuration now uses the expression `{{k.sink}}` as a broker URL. +On startup the `SinkBinding` will inject this environment variable. + +The SinkBinding is created as a Kubernetes resource and looks like this: + +.Example SinkBinding +[source,yaml] +---- +apiVersion: sources.knative.dev/v1 +kind: SinkBinding +metadata: + labels: + app.kubernetes.io/name: my-camel-app + name: my-camel-app-binding +spec: + sink: + ref: + apiVersion: eventing.knative.dev/v1 + kind: Broker + name: default + subject: + apiVersion: apps/v1 + kind: Deployment + name: my-camel-app +---- + +The binding resource specifies the reference to the Knative broker and a subject which usually is the Deployment resource that represents your Camel application running on Kubernetes. + +TIP: It may take some time for the SinkBinding to inject the `K_SINK` environment variable into the Deployment resource. +The Camel application may run into errors because of the missing variable when starting the Camel context. As a result you may want to wait for the environment variable to be present before starting the Camel context. You can do this with a Camel startup condition, for instance by setting `CAMEL_STARTUPCONDITION_ENVIRONMENT_VARIABLE_EXISTS=K_SINK`. + === Using ProducerTemplate When using Knative producer with a ProducerTemplate, it is necessary to specify a value for the CloudEvent source, simply by setting a value for the header 'CamelCloudEventSource'. @@ -180,3 +314,73 @@ When using Knative producer with a ProducerTemplate, it is necessary to specify ---- producerTemplate.sendBodyAndHeader("knative:event/broker-test", body, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "my-source-name"); ---- + +=== Consuming events + +The Knative event consumption is based on starting a Http service as part of the Camel application. +The Knative broker will invoke the service then with the event data. +The concept uses a so called `Trigger` resource that connects the application with the Knative broker event stream. +The trigger specifies which events should be sent to the Http service that is part of the Camel application. + +As sample trigger resource looks like this: + +.Trigger resource +[source,yaml] +---- +apiVersion: eventing.knative.dev/v1 +kind: Trigger +metadata: + labels: + app.kubernetes.io/name: my-camel-app + eventing.knative.dev/broker: default + name: my-camel-app-trigger +spec: + broker: default + subscriber: + ref: + apiVersion: v1 + kind: Service + name: my-camel-app +---- + +The trigger resource references a Knative broker by its name (`default`) and specifies the subscriber which is an arbitrary Kubernetes Service. +The trigger will invoke the service subscriber for each event on the broker. +The trigger may specify filters on event attributes to select the events that should be sent to the subscriber. + +The Service resource is part of the Camel application running on the Kubernetes cluster and points to an exposed Http service and port. +The Knative Camel component will automatically configure this Http service when consuming events in a Camel route. + +Just use the `event` resource type in your Camel route like this: + +.Example +[source,java] +---- +RouteBuilder.addRoutes(context, b -> { + b.from("knative:event/default?kind=Broker&name=default") + .to("log:info"); +}); +---- + +The according `Knative Environment` configuration that specifies the Http service looks like this: + +.knative.json +[source,json] +---- +{ + "resources": [ + { + "name": "default", + "type": "event", + "endpointKind": "source", + "path": "/", + "objectApiVersion": "eventing.knative.dev/v1", + "objectKind": "Broker", + "objectName": "default", + "reply": false + } + ] +} +---- + +This will create a proper Http service with the right resource path routing so that all incoming event requests will be consumed by the Camel route. +Once again the Knative broker will use CloudEvent data format by default, so you can access the CloudEvent attributes such as event type, id, source, subject in the Camel route. diff --git a/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc b/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc index 541ecfc70a4..0c40bf40528 100644 --- a/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc +++ b/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc @@ -9,4 +9,157 @@ *Since Camel {since}* -HTTP transport for the camel-knative component. +The `camel-knative-http` module represents the HTTP transport for the `camel-knative` component. + +Maven users will need to add the following dependency to their `pom.xml` +for this component. + +[source,xml] +------------------------------------------------------------ +<dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-knative-http</artifactId> + <version>x.x.x</version> + <!-- use the same version as your Camel version --> +</dependency> +------------------------------------------------------------ + +== Knative Http producer factory + +The Knative Http producer factory creates the producer instances that connect to the Knative broker via Http transport. +The factory provides some configuration options that you can set to customize the Http connections and the way the client sends requests to the broker. + +First of all the producer factory performs a lookup on the Vertx instance and the VertxOptions, so you can customize these resources and bind them to the Camel context prior to using the Kntive component. + +.Example +[source,java] +---- +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; + +VertxOptions options = new VertxOptions(); +context.getRegistry().bind("vertxOptions", options); + +Vertx vertx = Vertx.vertx(options); +context.getRegistry().bind("vertxInstance", vertx); +---- + +In the very same manner you may also bind the Vertx web client options to the Camel context. +The producer factory will automatically perform the lookup of the options instance. + +.Example +[source,java] +---- +import io.vertx.ext.web.client.WebClientOptions; + +WebClientOptions clientOptions = new WebClientOptions().setConnectTimeout(120000); +context.getRegistry().bind("myClientOptions", clientOptions); +---- + +You may also explicitly set the options instance via property configuration: + +.application.properties +[source,properties] +---- +camel.component.knative.producerFactory.clientOptions=#bean:myClientOptions +---- + +This is a good option when you have multiple options instances available in the Camel context. +Read more about property binding configuration in chapter xref:manual::property-binding-support.adoc[Property binding support]. + +=== Knative client SSL support + +The Knative broker may use secure connections using TLS authentication with CA certificates. +The Apache Camel Knative component supports special web client options to easily enable SSL when connecting to the Knative broker. + +You can set the client options on the Knative Http producer factory as follows: + +.Example +[source,java] +---- +import org.apache.camel.component.knative.KnativeComponent; +import org.apache.camel.component.knative.http.KnativeHttpClientOptions; +import org.apache.camel.component.knative.http.KnativeHttpProducerFactory; + +KnativeHttpClientOptions sslClientOptions = new KnativeHttpClientOptions(context); +sslClientOptions.setSslEnabled(true); +sslClientOptions.setKeyPath("keystore/client.pem"); +sslClientOptions.setKeyCertPath("keystore/client.crt"); +sslClientOptions.setTrustCertPath("keystore/trust.crt"); + +KnativeComponent component = context.getComponent("knative", KnativeComponent.class); +if (component.getProducerFactory() instanceof KnativeHttpProducerFactory httpProducerFactory) { + httpProducerFactory.setClientOptions(sslClientOptions); +} +---- + +You can also use property based component configuration to set the client options on the producer factory: + +.application.properties +[source,properties] +---- +camel.component.knative.producerFactory.clientOptions=#bean:myClientOptions +---- + +TIP: When there is no proper trust certificate available (e.g. on test environments) you can use a trust all strategy on the client options with the class `org.apache.camel.component.knative.http.TrustAllOptions`. + +.TrustAllOptions +[source,java] +---- +sslClientOptions.setTrustOptions(TrustAllOptions.INSTANCE); +---- + +==== Autoconfiguration SSL options via environment variables + +The Knative client options are able to perform autoconfiguration based on resolving properties from system property or environment variable settings. +During the initialization phase the client options automatically look for environment settings that configure the options. + +All environment settings that configure the Knative client SSL options use a specific property key prefix + +* camel.knative.client.ssl.<property_name> +* CAMEL_KNATIVE_CLIENT_SSL_<PROPERTY_NAME> + +You can use this kind of autoconfiguration to enable SSL on the Knative client with property based config only. + +.application.properties +[source,properties] +---- +camel.knative.client.ssl.enabled=true +camel.knative.client.ssl.key.path=keystore/client.pem +camel.knative.client.ssl.key.cert.path=keystore/client.crt + +camel.component.knative.producerFactory.clientOptions=#class:org.apache.camel.component.knative.http.KnativeHttpClientOptions +---- + +This will instantiate a new instance of `org.apache.camel.component.knative.http.KnativeHttpClientOptions` and perform the autoconfiguration via system property and environment variable settings on that instance. + +TIP: By default, the SSL client options will verify the hostname of the Knative broker as part of the SSL handshake. +In test environments this often leads to SSL handshake errors. You can disable the hostname verification for the client options with `camel.knative.client.ssl.verify.hostname=false` + +The same autoconfiguration works with environment variables which is very useful when set on Kubernetes deployments. + +.Deployment +[source,yaml] +---- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-camel-app +spec: + selector: + matchLabels: + app.kubernetes.io/name: my-camel-app + template: + metadata: + labels: + app.kubernetes.io/name: my-camel-app + spec: + containers: + - name: timer-source + image: camel-examples/my-camel-app:1.0-SNAPSHOT + env: + - name: CAMEL_KNATIVE_CLIENT_SSL_ENABLED + value: "true" + - name: CAMEL_KNATIVE_CLIENT_SSL_KEY_CERT_PATH + value: /knative-certs/knative-eventing-bundle.pem +---- diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpClientOptions.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpClientOptions.java new file mode 100644 index 00000000000..9e0901766a6 --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpClientOptions.java @@ -0,0 +1,298 @@ +/* + * 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.knative.http; + +import java.util.Optional; + +import io.vertx.core.net.JksOptions; +import io.vertx.core.net.KeyCertOptions; +import io.vertx.core.net.KeyStoreOptionsBase; +import io.vertx.core.net.PemKeyCertOptions; +import io.vertx.core.net.PemTrustOptions; +import io.vertx.core.net.PfxOptions; +import io.vertx.core.net.TrustOptions; +import io.vertx.ext.web.client.WebClientOptions; +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.spi.PropertiesComponent; + +/** + * Knative client options are able to autoconfigure secure Http SSL transport options. Options are automatically + * initialized via system property or environment variable settings. System property and environment variable settings + * use a specific property name prefix. The properties get resolved via the given Camel context property component. + */ +public class KnativeHttpClientOptions extends WebClientOptions implements CamelContextAware { + + private static final String PROPERTY_PREFIX = "camel.knative.client.ssl."; + + private CamelContext camelContext; + + private boolean sslEnabled; + private boolean verifyHostName; + private String keystorePath; + private String keystorePassword; + private String[] keyPath; + private String[] keyCertPath; + private String truststorePath; + private String truststorePassword; + private String[] trustCertPath; + + private KeyCertOptions keyCertOptions; + private TrustOptions trustOptions; + + public KnativeHttpClientOptions() { + } + + public KnativeHttpClientOptions(CamelContext camelContext) { + this.camelContext = camelContext; + configureOptions(camelContext); + } + + public void configureOptions() { + if (camelContext != null) { + configureOptions(camelContext); + } + } + + /** + * Configures this web client options instance based on properties and environment variables resolved with the given + * Camel context. + */ + public void configureOptions(CamelContext camelContext) { + PropertiesComponent propertiesComponent = camelContext.getPropertiesComponent(); + + boolean sslEnabled = Boolean.parseBoolean( + propertiesComponent.resolveProperty(PROPERTY_PREFIX + "enabled").orElse("false")); + setSslEnabled(sslEnabled); + + if (sslEnabled) { + boolean verifyHostname = Boolean.parseBoolean( + propertiesComponent.resolveProperty(PROPERTY_PREFIX + "verify.hostname").orElse("true")); + setVerifyHostName(verifyHostname); + + Optional<String> keystorePath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "keystore.path"); + String keystorePassword = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "keystore.password").orElse(""); + if (keystorePath.isPresent()) { + setKeystorePath(keystorePath.get()); + setKeystorePassword(keystorePassword); + } else { + Optional<String> keyPath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "key.path"); + if (keyPath.isPresent()) { + String[] keyPathItems = keyPath.get().split(","); + if (keyPathItems.length > 0) { + setKeyPath(keyPathItems); + } + } + + Optional<String> keyCertPath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "key.cert.path"); + if (keyCertPath.isPresent()) { + String[] keyCertPathItems = keyCertPath.get().split(","); + if (keyCertPathItems.length > 0) { + setKeyCertPath(keyCertPathItems); + } + } + } + + Optional<String> truststorePath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "truststore.path"); + String truststorePassword = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "truststore.password").orElse(""); + Optional<String> trustCertPath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "trust.cert.path"); + if (truststorePath.isPresent()) { + setTruststorePath(truststorePath.get()); + setTruststorePassword(truststorePassword); + } else if (trustCertPath.isPresent()) { + String[] trustCertPathItems = trustCertPath.get().split(","); + setTrustCertPath(trustCertPathItems); + } else { + trustOptions = TrustAllOptions.INSTANCE; + setTrustOptions(trustOptions); + } + } + } + + private void initializeKeyCertOptions(String path) { + if (keyCertOptions == null) { + if (path == null) { + keyCertOptions = new JksOptions(); + } else if (path.endsWith(".p12")) { + keyCertOptions = new PfxOptions(); + } else if (path.endsWith(".pem")) { + keyCertOptions = new PemKeyCertOptions(); + } else { + keyCertOptions = new JksOptions(); + } + this.setKeyCertOptions(keyCertOptions); + } + } + + private void initializeTrustOptions(String path) { + if (trustOptions == null) { + if (path == null) { + trustOptions = new JksOptions(); + } else if (path.endsWith(".p12")) { + trustOptions = new PfxOptions(); + } else if (path.endsWith(".pem")) { + trustOptions = new PemTrustOptions(); + } else { + trustOptions = new JksOptions(); + } + this.setTrustOptions(trustOptions); + } + } + + public void setSslEnabled(boolean sslEnabled) { + this.sslEnabled = sslEnabled; + this.setSsl(sslEnabled); + } + + public boolean isSslEnabled() { + return sslEnabled; + } + + public void setVerifyHostName(boolean verifyHostName) { + this.verifyHostName = verifyHostName; + this.setVerifyHost(verifyHostName); + } + + public boolean isVerifyHostName() { + return verifyHostName; + } + + public void setKeystorePath(String keystorePath) { + this.keystorePath = keystorePath; + initializeKeyCertOptions(keystorePath); + if (keyCertOptions instanceof KeyStoreOptionsBase keyStoreOptionsBase) { + keyStoreOptionsBase.setPath(keystorePath); + } + } + + public String getKeystorePath() { + return keystorePath; + } + + public void setKeystorePassword(String keystorePassword) { + this.keystorePassword = keystorePassword; + initializeKeyCertOptions(keystorePath); + if (keyCertOptions instanceof KeyStoreOptionsBase keyStoreOptionsBase) { + keyStoreOptionsBase.setPassword(keystorePassword); + } + } + + public String getKeystorePassword() { + return keystorePassword; + } + + public void setKeyPath(String keyPath) { + this.keyPath = new String[] { keyPath }; + initializeKeyCertOptions(keyPath); + if (keyCertOptions instanceof PemKeyCertOptions pemKeyCertOptions) { + pemKeyCertOptions.setKeyPath(keyPath); + } + } + + public void setKeyPath(String... keyPaths) { + this.keyPath = keyPaths; + initializeKeyCertOptions(keyPaths[0]); + if (keyCertOptions instanceof PemKeyCertOptions pemKeyCertOptions) { + for (String path : keyPaths) { + pemKeyCertOptions.addKeyPath(path.trim()); + } + } + } + + public String[] getKeyPath() { + return keyPath; + } + + public void setKeyCertPath(String keyCertPath) { + this.keyCertPath = new String[] { keyCertPath }; + initializeKeyCertOptions(keyCertPath); + if (keyCertOptions instanceof PemKeyCertOptions pemKeyCertOptions) { + pemKeyCertOptions.addCertPath(keyCertPath); + } + } + + public void setKeyCertPath(String... keyCertPaths) { + this.keyCertPath = keyCertPaths; + initializeKeyCertOptions(keyCertPaths[0]); + if (keyCertOptions instanceof PemKeyCertOptions pemKeyCertOptions) { + for (String certPath : keyCertPaths) { + pemKeyCertOptions.addCertPath(certPath.trim()); + } + } + } + + public String[] getKeyCertPath() { + return keyCertPath; + } + + public void setTruststorePath(String truststorePath) { + this.truststorePath = truststorePath; + initializeTrustOptions(truststorePath); + if (trustOptions instanceof KeyStoreOptionsBase keyStoreOptionsBase) { + keyStoreOptionsBase.setPath(truststorePath); + } + } + + public String getTruststorePath() { + return truststorePath; + } + + public void setTruststorePassword(String truststorePassword) { + this.truststorePassword = truststorePassword; + initializeTrustOptions(truststorePath); + if (trustOptions instanceof KeyStoreOptionsBase keyStoreOptionsBase) { + keyStoreOptionsBase.setPassword(truststorePassword); + } + } + + public String getTruststorePassword() { + return truststorePassword; + } + + public void setTrustCertPath(String trustCertPath) { + this.trustCertPath = new String[] { trustCertPath }; + initializeTrustOptions(trustCertPath); + if (trustOptions instanceof PemTrustOptions pemTrustOptions) { + pemTrustOptions.addCertPath(trustCertPath); + } + } + + public void setTrustCertPath(String... trustCertPaths) { + this.trustCertPath = trustCertPaths; + initializeTrustOptions(trustCertPaths[0]); + if (trustOptions instanceof PemTrustOptions pemTrustOptions) { + for (String certPath : trustCertPaths) { + pemTrustOptions.addCertPath(certPath.trim()); + } + } + } + + public String[] getTrustCertPath() { + return trustCertPath; + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + configureOptions(); + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } +} diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java index 640343ea189..0a9e2f467fe 100644 --- a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java +++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java @@ -149,6 +149,10 @@ public class KnativeHttpProducer extends DefaultAsyncProducer { if (response.cause() != null) { exceptionMessage += " caused by: " + response.cause().getMessage(); + + if (response.cause().getCause() != null) { + exceptionMessage += ", " + response.cause().getCause().getMessage(); + } } exchange.setException(new CamelException(exceptionMessage)); diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java index d5cbe2393ef..e4b1c3aa78f 100644 --- a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java +++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java @@ -78,6 +78,11 @@ public class KnativeHttpProducerFactory extends ServiceSupport implements CamelC if (vertx == null) { vertx = KnativeHttpSupport.lookupVertxInstance(camelContext); } + + if (vertxHttpClientOptions == null) { + KnativeHttpSupport.lookupClientOptions(camelContext) + .ifPresent(options -> vertxHttpClientOptions = options); + } } @Override diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java index c72c8c52591..8cb47c14a30 100644 --- a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java +++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Predicate; import io.vertx.core.Vertx; @@ -139,4 +140,20 @@ public final class KnativeHttpSupport { return Vertx.vertx(options); } + + /** + * Retrieve client options from given CamelContext. + * + * @param camelContext the current context. + * @return client options or empty + */ + public static Optional<KnativeHttpClientOptions> lookupClientOptions(CamelContext camelContext) { + KnativeHttpClientOptions clientOptions + = CamelContextHelper.findSingleByType(camelContext, KnativeHttpClientOptions.class); + if (clientOptions != null) { + return Optional.of(clientOptions); + } + + return Optional.empty(); + } } diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/TrustAllOptions.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/TrustAllOptions.java new file mode 100644 index 00000000000..0322d50e2b1 --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/TrustAllOptions.java @@ -0,0 +1,98 @@ +/* + * 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.knative.http; + +import java.security.KeyStore; +import java.security.Provider; +import java.security.cert.X509Certificate; +import java.util.function.Function; + +import javax.net.ssl.ManagerFactoryParameters; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.TrustManagerFactorySpi; +import javax.net.ssl.X509TrustManager; + +import io.vertx.core.Vertx; +import io.vertx.core.net.TrustOptions; + +/** + * Trust options for trusting all client and server certificates. Do not use in production environments but primarily in + * test environments. Implementation is heavily based on the Quarkus TLS registry implementation. + */ +public class TrustAllOptions implements TrustOptions { + + public static TrustAllOptions INSTANCE = new TrustAllOptions(); + + private static final TrustManager TRUST_ALL_MANAGER = new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] x509Certificates, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + + private static final Provider PROVIDER = new Provider("", "0.0", "") { + + }; + + private TrustAllOptions() { + // Avoid direct instantiation. + } + + @Override + public TrustOptions copy() { + return this; + } + + @Override + public TrustManagerFactory getTrustManagerFactory(Vertx vertx) { + return new TrustManagerFactory(new TrustManagerFactorySpi() { + @Override + protected void engineInit(KeyStore keyStore) { + } + + @Override + protected void engineInit(ManagerFactoryParameters managerFactoryParameters) { + } + + @Override + protected TrustManager[] engineGetTrustManagers() { + return new TrustManager[] { TRUST_ALL_MANAGER }; + } + }, PROVIDER, "") { + + }; + } + + @Override + public Function<String, TrustManager[]> trustManagerMapper(Vertx vertx) { + return new Function<String, TrustManager[]>() { + @Override + public TrustManager[] apply(String name) { + return new TrustManager[] { TRUST_ALL_MANAGER }; + } + }; + } +} diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java index 5bda97d7995..df8782a054d 100644 --- a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java +++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java @@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit; import io.vertx.core.Handler; import io.vertx.core.Vertx; import io.vertx.core.http.HttpServer; +import io.vertx.core.http.HttpServerOptions; import io.vertx.core.http.HttpServerRequest; import io.vertx.ext.web.Router; import io.vertx.ext.web.RoutingContext; @@ -115,7 +116,7 @@ public class KnativeHttpServer extends ServiceSupport { protected void doStart() { this.executor = context.getExecutorServiceManager().newSingleThreadExecutor(this, "knative-http-server"); this.vertx = Vertx.vertx(); - this.server = vertx.createHttpServer(); + this.server = vertx.createHttpServer(getServerOptions()); this.router = Router.router(vertx); this.router.route(path) .handler(event -> { @@ -234,4 +235,8 @@ public class KnativeHttpServer extends ServiceSupport { executor = null; } } + + protected HttpServerOptions getServerOptions() { + return new HttpServerOptions(); + } } diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java index 40bf8a15c48..40d6198ace0 100644 --- a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java +++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java @@ -41,6 +41,7 @@ import org.apache.camel.component.knative.spi.Knative; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.http.base.HttpOperationFailedException; import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.support.PropertyBindingSupport; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.test.AvailablePortFinder; import org.apache.camel.util.ObjectHelper; @@ -53,12 +54,7 @@ import org.junit.jupiter.params.provider.EnumSource; import static io.restassured.RestAssured.config; import static io.restassured.RestAssured.given; import static io.restassured.config.EncoderConfig.encoderConfig; -import static org.apache.camel.component.knative.KnativeEnvironmentSupport.channel; -import static org.apache.camel.component.knative.KnativeEnvironmentSupport.endpoint; -import static org.apache.camel.component.knative.KnativeEnvironmentSupport.event; -import static org.apache.camel.component.knative.KnativeEnvironmentSupport.sourceChannel; -import static org.apache.camel.component.knative.KnativeEnvironmentSupport.sourceEndpoint; -import static org.apache.camel.component.knative.KnativeEnvironmentSupport.sourceEvent; +import static org.apache.camel.component.knative.KnativeEnvironmentSupport.*; import static org.apache.camel.component.knative.http.KnativeHttpTestSupport.configureKnativeComponent; import static org.apache.camel.component.knative.http.KnativeHttpTestSupport.configurePlatformHttpComponent; import static org.apache.camel.component.knative.http.KnativeHttpTestSupport.httpAttribute; @@ -1934,4 +1930,239 @@ public class KnativeHttpTest { server.stop(); } } + + @ParameterizedTest + @EnumSource(CloudEvents.class) + void testSecureClientPemCertOptions(CloudEvent ce) throws Exception { + final KnativeHttpsServer server = new KnativeHttpsServer(context); + + KnativeComponent component = configureKnativeComponent( + context, + ce, + event( + Knative.EndpointKind.sink, + "default", + String.format("https://%s:%d", server.getHost(), server.getPort()), + Map.of( + Knative.CONTENT_TYPE, "text/plain"))); + + KnativeHttpClientOptions clientOptions = new KnativeHttpClientOptions(context); + clientOptions.setSslEnabled(true); + clientOptions.setKeyPath("keystore/client.pem"); + clientOptions.setKeyCertPath("keystore/client.crt"); + clientOptions.setVerifyHostName(false); + clientOptions.setTrustOptions(TrustAllOptions.INSTANCE); + + if (component.getProducerFactory() instanceof KnativeHttpProducerFactory httpProducerFactory) { + httpProducerFactory.setClientOptions(clientOptions); + } + + RouteBuilder.addRoutes(context, b -> { + b.from("direct:start") + .to("knative:event"); + }); + + context.start(); + try { + server.start(); + template.sendBody("direct:start", "test"); + + HttpServerRequest request = server.poll(30, TimeUnit.SECONDS); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version()); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))) + .isEqualTo("org.apache.camel.event"); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull(); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull(); + assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain"); + } finally { + server.stop(); + } + } + + @ParameterizedTest + @EnumSource(CloudEvents.class) + void testSecureClientPfxCertOptions(CloudEvent ce) throws Exception { + final KnativeHttpsServer server = new KnativeHttpsServer(context); + + KnativeComponent component = configureKnativeComponent( + context, + ce, + event( + Knative.EndpointKind.sink, + "default", + String.format("https://%s:%d", server.getHost(), server.getPort()), + Map.of( + Knative.CONTENT_TYPE, "text/plain"))); + + KnativeHttpClientOptions clientOptions = new KnativeHttpClientOptions(context); + clientOptions.setSslEnabled(true); + clientOptions.setKeyPath("keystore/client.p12"); + clientOptions.setVerifyHostName(false); + clientOptions.setTrustOptions(TrustAllOptions.INSTANCE); + + if (component.getProducerFactory() instanceof KnativeHttpProducerFactory httpProducerFactory) { + httpProducerFactory.setClientOptions(clientOptions); + } + + RouteBuilder.addRoutes(context, b -> { + b.from("direct:start") + .to("knative:event"); + }); + + context.start(); + try { + server.start(); + template.sendBody("direct:start", "test"); + + HttpServerRequest request = server.poll(30, TimeUnit.SECONDS); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version()); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))) + .isEqualTo("org.apache.camel.event"); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull(); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull(); + assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain"); + } finally { + server.stop(); + } + } + + @ParameterizedTest + @EnumSource(CloudEvents.class) + void testSecureClientJksCertOptions(CloudEvent ce) throws Exception { + final KnativeHttpsServer server = new KnativeHttpsServer(context); + + KnativeComponent component = configureKnativeComponent( + context, + ce, + event( + Knative.EndpointKind.sink, + "default", + String.format("https://%s:%d", server.getHost(), server.getPort()), + Map.of( + Knative.CONTENT_TYPE, "text/plain"))); + + KnativeHttpClientOptions clientOptions = new KnativeHttpClientOptions(context); + clientOptions.setSslEnabled(true); + clientOptions.setKeystorePath("keystore/client.jks"); + clientOptions.setKeystorePassword("secr3t"); + clientOptions.setVerifyHostName(false); + clientOptions.setTruststorePath("keystore/truststore.jks"); + clientOptions.setTruststorePassword("secr3t"); + + if (component.getProducerFactory() instanceof KnativeHttpProducerFactory httpProducerFactory) { + httpProducerFactory.setClientOptions(clientOptions); + } + + RouteBuilder.addRoutes(context, b -> { + b.from("direct:start") + .to("knative:event"); + }); + + context.start(); + try { + server.start(); + template.sendBody("direct:start", "test"); + + HttpServerRequest request = server.poll(30, TimeUnit.SECONDS); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version()); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))) + .isEqualTo("org.apache.camel.event"); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull(); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull(); + assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain"); + } finally { + server.stop(); + } + } + + @ParameterizedTest + @EnumSource(CloudEvents.class) + void testSecureClientOptionsLookup(CloudEvent ce) throws Exception { + final KnativeHttpsServer server = new KnativeHttpsServer(context); + + configureKnativeComponent( + context, + ce, + event( + Knative.EndpointKind.sink, + "default", + String.format("https://%s:%d", server.getHost(), server.getPort()), + Map.of( + Knative.CONTENT_TYPE, "text/plain"))); + + KnativeHttpClientOptions sslClientOptions = new KnativeHttpClientOptions(context); + sslClientOptions.setSslEnabled(true); + sslClientOptions.setKeyPath("keystore/client.pem"); + sslClientOptions.setKeyCertPath("keystore/client.crt"); + sslClientOptions.setVerifyHostName(false); + sslClientOptions.setTrustOptions(TrustAllOptions.INSTANCE); + + context.getRegistry().bind("sslClientOptions", sslClientOptions); + + RouteBuilder.addRoutes(context, b -> { + b.from("direct:start") + .to("knative:event"); + }); + + context.start(); + try { + server.start(); + template.sendBody("direct:start", "test"); + + HttpServerRequest request = server.poll(30, TimeUnit.SECONDS); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version()); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))) + .isEqualTo("org.apache.camel.event"); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull(); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull(); + assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain"); + } finally { + server.stop(); + } + } + + @ParameterizedTest + @EnumSource(CloudEvents.class) + void testSecureClientOptionsPropertyConf(CloudEvent ce) throws Exception { + final KnativeHttpsServer server = new KnativeHttpsServer(context); + + context.getPropertiesComponent().addInitialProperty("camel.knative.client.ssl.enabled", "true"); + context.getPropertiesComponent().addInitialProperty("camel.knative.client.ssl.verify.hostname", "false"); + context.getPropertiesComponent().addInitialProperty("camel.knative.client.ssl.key.path", "keystore/client.pem"); + context.getPropertiesComponent().addInitialProperty("camel.knative.client.ssl.key.cert.path", "keystore/client.crt"); + + KnativeComponent component = configureKnativeComponent( + context, + ce, + event( + Knative.EndpointKind.sink, + "default", + String.format("https://%s:%d", server.getHost(), server.getPort()), + Map.of( + Knative.CONTENT_TYPE, "text/plain"))); + + PropertyBindingSupport.build().bind(context, component, + "camel.component.knative.producerFactory.clientOptions", "#class:" + KnativeHttpClientOptions.class.getName()); + + RouteBuilder.addRoutes(context, b -> { + b.from("direct:start") + .to("knative:event"); + }); + + context.start(); + try { + server.start(); + template.sendBody("direct:start", "test"); + + HttpServerRequest request = server.poll(30, TimeUnit.SECONDS); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version()); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))) + .isEqualTo("org.apache.camel.event"); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull(); + assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull(); + assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain"); + } finally { + server.stop(); + } + } } diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpsServer.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpsServer.java new file mode 100644 index 00000000000..6a56aed70db --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpsServer.java @@ -0,0 +1,72 @@ +/* + * 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.knative.http; + +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerOptions; +import io.vertx.core.net.JksOptions; +import io.vertx.core.net.PemKeyCertOptions; +import io.vertx.ext.web.RoutingContext; +import org.apache.camel.CamelContext; +import org.apache.camel.test.AvailablePortFinder; + +public class KnativeHttpsServer extends KnativeHttpServer { + + public KnativeHttpsServer(CamelContext context) { + super(context, "localhost", AvailablePortFinder.getNextAvailable(), "/", null); + } + + public KnativeHttpsServer(CamelContext context, int port) { + super(context, "localhost", port, "/", null); + } + + public KnativeHttpsServer(CamelContext context, int port, Handler<RoutingContext> handler) { + super(context, "localhost", port, "/", handler); + } + + public KnativeHttpsServer(CamelContext context, Handler<RoutingContext> handler) { + super(context, "localhost", AvailablePortFinder.getNextAvailable(), "/", handler); + } + + public KnativeHttpsServer(CamelContext context, String host, int port, String path) { + super(context, host, port, path, null); + } + + public KnativeHttpsServer(CamelContext context, String host, String path) { + super(context, host, AvailablePortFinder.getNextAvailable(), path, null); + } + + public KnativeHttpsServer(CamelContext context, String host, String path, Handler<RoutingContext> handler) { + super(context, host, AvailablePortFinder.getNextAvailable(), path, handler); + } + + @Override + protected HttpServerOptions getServerOptions() { + return new HttpServerOptions() + .setSsl(true) + .setKeyCertOptions( + new PemKeyCertOptions() + .setKeyPath("keystore/server.pem") + .setCertPath("keystore/server.crt")) + .setTrustOptions( + new JksOptions() + .setPath("keystore/truststore.jks") + .setPassword("secr3t") + + ); + } +} diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.crt b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.crt new file mode 100644 index 00000000000..b2cc0e1fdae --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFuTCCA6GgAwIBAgIBZTANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJERTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQ0wCwYDVQQDDARZQUtTMSgwJgYJKoZIhvcNAQkBFhl5YWtzLWRldkBn +b29nbGVncm91cHMuY29tMB4XDTI0MDYxODA3MDM1OFoXDTI1MDYwOTA3MDM1OFow +fjELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu +dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDENMAsGA1UEAwwEWUFLUzEoMCYGCSqGSIb3 +DQEJARYZeWFrcy1kZXZAZ29vZ2xlZ3JvdXBzLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANvrpZbRRbUmngCvZKKdqCsyoAtlrGtXy8zpUlyMwFcI +RR1UZgxVNNuqjA3mQ5HdaPHYCqQdsDD8SpIreNuTjdnlmxA5vxGuW0Aq+lX1SKq+ +CjsycurX50uUPsiR/znQhkhVkbjYGOASbZ0MJ4u0jumKk/z1SSm8qpfnLsdGxEFj +Tg+H7N7C/HJ3ZOVBbFZBLHCgIzXsVhIgz8uv/hPn/57BlvUJqoAY9z+ZCPCQOYE7 +3KNLI2VgSGbpePy0LiI4BqG14X4e7GxMa0NBkOMVWNdt/g80c2O6urrA9UEazVB9 +Ojs0FnBRKhbeF6cOoiAljuKZklq5nzslIMIlDcj9PHESwPsK3IdOR5iJAdRO2eyQ +NGJvgDMvQuNuscV/Hpqw6LFNXZ615EBUlStJ9d1Ea8dCgBZpMQnV2bvgY6jkNazm +StJrv9+N7hMdlRn5T/ZWzbi92YjyrOuudo5rBpQTHkzy5conLFwoHnfBpFhfB6+4 +mFUhM6RtQiq3jWjO6zylwP4xPGcDlUxb9YBSvPenXbVz3wi1p4fADkdxbAyS3xWn +46GEKgxChvuhiwvGYExZIKDL9rjWNWaNoretJcEDQgZLm1XYjt2ie6Z3c8I6TprO +FgfKTXlzYytUvEOqvsY+zsuCkiIDYptRhXW16LN8J5j5BcA7LFqVS5nf1zuj7kfN +AgMBAAGjQjBAMB0GA1UdDgQWBBSGCLa6UTN3VSsBFuSC5aV0S9S/rjAfBgNVHSME +GDAWgBSZfBQ9qjN35XGTAyXi79Wa7r0FQDANBgkqhkiG9w0BAQsFAAOCAgEAQNdT +nBoUyL+N5/OiF7jqlkyTaNm+IIEbGX80LsjRLpmmAMbpZtnbcxXn7lF3EGEyAuUA +9lEbVY545xymqeFw53vxZSEzboCCoxphgjTIs+/edLSSrh4SEbVvJnjlM8pQiCEh +fZ3FsKyer8jS/mmSGr1cx4Opwcbi5UWg+lu0dsWcf1oDqS7g01EZS2AS0JtLEcmN +fgMP0Y0YIbTLUQayk8oE6KGeG8wpB/xuPmdecRINEYpkdQKPPJ5wmdFGnTekLiOj +obJZeBu5H1XAAfVUYNr9ShN885hmfyRIWn5tpo34S/df/hukyi83VWnUeoCLjOfx +wsrHk0Qn+/WqXxJmzKgz5Cl7D2yVndMlGjKYlWoe/1E3/uqHWeOFzSneFm11Z+tW +K+4etGpRFYO0ZETv5Eaf0J6Fd2Qpk2FQg7xw/5UzAV97lhDNRr6yN2GxBs5gcPcK +tGcvay7coUkG4ZSmhUVRcqoXmNT3u1KxTMjUQDiWJpXtAGq4MHTSp37nW7fTnPKj +PS9vNPCNoUDVj5IpWM7a7T/9mbrhsubreye7hy2qF85w/UWL8V+E797t0WQIdFRy +eb+3EXcFenRnyVCDX81uz84Xmo7EeNawbucJKyY8Nx2XwJGzn5o5Wm7Z5xqE2rsc +boqQ3Gqp84ATr6EnjueDKfcdfjI/XdzR8ZZQtkg= +-----END CERTIFICATE----- diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.jks b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.jks new file mode 100644 index 00000000000..6d7ac474f15 Binary files /dev/null and b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.jks differ diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.p12 b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.p12 new file mode 100644 index 00000000000..4bdbc6463bf Binary files /dev/null and b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.p12 differ diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.pem b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.pem new file mode 100644 index 00000000000..f7b981dc254 --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/test/resources/keystore/client.pem @@ -0,0 +1,85 @@ +-----BEGIN PRIVATE KEY----- +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 +HoZLVdKJ3snurrpaDfp+YeNiduB6Ew== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFuTCCA6GgAwIBAgIBZTANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJERTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQ0wCwYDVQQDDARZQUtTMSgwJgYJKoZIhvcNAQkBFhl5YWtzLWRldkBn +b29nbGVncm91cHMuY29tMB4XDTI0MDYxODA3MDM1OFoXDTI1MDYwOTA3MDM1OFow +fjELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu +dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDENMAsGA1UEAwwEWUFLUzEoMCYGCSqGSIb3 +DQEJARYZeWFrcy1kZXZAZ29vZ2xlZ3JvdXBzLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANvrpZbRRbUmngCvZKKdqCsyoAtlrGtXy8zpUlyMwFcI +RR1UZgxVNNuqjA3mQ5HdaPHYCqQdsDD8SpIreNuTjdnlmxA5vxGuW0Aq+lX1SKq+ +CjsycurX50uUPsiR/znQhkhVkbjYGOASbZ0MJ4u0jumKk/z1SSm8qpfnLsdGxEFj +Tg+H7N7C/HJ3ZOVBbFZBLHCgIzXsVhIgz8uv/hPn/57BlvUJqoAY9z+ZCPCQOYE7 +3KNLI2VgSGbpePy0LiI4BqG14X4e7GxMa0NBkOMVWNdt/g80c2O6urrA9UEazVB9 +Ojs0FnBRKhbeF6cOoiAljuKZklq5nzslIMIlDcj9PHESwPsK3IdOR5iJAdRO2eyQ +NGJvgDMvQuNuscV/Hpqw6LFNXZ615EBUlStJ9d1Ea8dCgBZpMQnV2bvgY6jkNazm +StJrv9+N7hMdlRn5T/ZWzbi92YjyrOuudo5rBpQTHkzy5conLFwoHnfBpFhfB6+4 +mFUhM6RtQiq3jWjO6zylwP4xPGcDlUxb9YBSvPenXbVz3wi1p4fADkdxbAyS3xWn +46GEKgxChvuhiwvGYExZIKDL9rjWNWaNoretJcEDQgZLm1XYjt2ie6Z3c8I6TprO +FgfKTXlzYytUvEOqvsY+zsuCkiIDYptRhXW16LN8J5j5BcA7LFqVS5nf1zuj7kfN +AgMBAAGjQjBAMB0GA1UdDgQWBBSGCLa6UTN3VSsBFuSC5aV0S9S/rjAfBgNVHSME +GDAWgBSZfBQ9qjN35XGTAyXi79Wa7r0FQDANBgkqhkiG9w0BAQsFAAOCAgEAQNdT +nBoUyL+N5/OiF7jqlkyTaNm+IIEbGX80LsjRLpmmAMbpZtnbcxXn7lF3EGEyAuUA +9lEbVY545xymqeFw53vxZSEzboCCoxphgjTIs+/edLSSrh4SEbVvJnjlM8pQiCEh +fZ3FsKyer8jS/mmSGr1cx4Opwcbi5UWg+lu0dsWcf1oDqS7g01EZS2AS0JtLEcmN +fgMP0Y0YIbTLUQayk8oE6KGeG8wpB/xuPmdecRINEYpkdQKPPJ5wmdFGnTekLiOj +obJZeBu5H1XAAfVUYNr9ShN885hmfyRIWn5tpo34S/df/hukyi83VWnUeoCLjOfx +wsrHk0Qn+/WqXxJmzKgz5Cl7D2yVndMlGjKYlWoe/1E3/uqHWeOFzSneFm11Z+tW +K+4etGpRFYO0ZETv5Eaf0J6Fd2Qpk2FQg7xw/5UzAV97lhDNRr6yN2GxBs5gcPcK +tGcvay7coUkG4ZSmhUVRcqoXmNT3u1KxTMjUQDiWJpXtAGq4MHTSp37nW7fTnPKj +PS9vNPCNoUDVj5IpWM7a7T/9mbrhsubreye7hy2qF85w/UWL8V+E797t0WQIdFRy +eb+3EXcFenRnyVCDX81uz84Xmo7EeNawbucJKyY8Nx2XwJGzn5o5Wm7Z5xqE2rsc +boqQ3Gqp84ATr6EnjueDKfcdfjI/XdzR8ZZQtkg= +-----END CERTIFICATE----- diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/server.crt b/components/camel-knative/camel-knative-http/src/test/resources/keystore/server.crt new file mode 100644 index 00000000000..7dd9950e1d6 --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/test/resources/keystore/server.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFuTCCA6GgAwIBAgIBZDANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJERTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQ0wCwYDVQQDDARZQUtTMSgwJgYJKoZIhvcNAQkBFhl5YWtzLWRldkBn +b29nbGVncm91cHMuY29tMB4XDTI0MDYxODA3MDIxOFoXDTI1MDYwOTA3MDIxOFow +fjELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu +dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDENMAsGA1UEAwwEWUFLUzEoMCYGCSqGSIb3 +DQEJARYZeWFrcy1kZXZAZ29vZ2xlZ3JvdXBzLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBALkh1o/EuEk+Ag1pczYTZ3AUG3ka/FaDdkvoHHlAeFkw +5zpT+fcR5vPnPMyXcfo5UazInnehtiUv3gyUaNAmocZpKR3UtdJDLtLEduj2iZbA +xFgNKCYPJd6lf4xlBxzuNO0H7Rhh2rAFNqgFutpA3vQKqEDN5rnUsYcoybXvYsUx +duhvhitZAjNQI4zwGaonoYvZMkA+u/wV0tvixEvpdNEUJKPdpErBVnzfUBRzBjNU +XFyFqgqUEOPhVGz726Ngo66G6JWXK2FlHaxGE5oFsWi3o2JgwrEua/DQOqWSGbmW +kcBcifVvNrpX3MjBN4vl28MVVXw/raUSvBIOWoaCQNJZHHVBPvd+ApT5ZKCTXSQK +YguWIa2XN4IFm7ozSec7CXH1YwPt6DMmHBQYv3R3AzOMkIijhbhjjGyEnzRuricB +1GybCUG4oXMglJc8LqCOpvIshGi9ZHuiKCFFUSQopu5uJhbvXc88VKNVBsKUZG4D +uJTNExfmtZ6lCEAqxHcGUejHSasNtttXY8jqJyGK2IiFW6jap7jk9InySyo+qu+q +ziZDiVbJK3pQ3eHTZETL075t4ZMkDrnHX0zrUMg2wRGTmYN+xk1LwEByenX2vp/g +jAqtEPwtRbLFfsp1udhVJ7Y/FwpF18onfIYPqr6MwI3mfM65JfFJIDs/4IQ3SUB7 +AgMBAAGjQjBAMB0GA1UdDgQWBBSBbZ0v4XX4+5in6ZAKoMcogXHlgDAfBgNVHSME +GDAWgBSZfBQ9qjN35XGTAyXi79Wa7r0FQDANBgkqhkiG9w0BAQsFAAOCAgEAOgTV +2Omgu5uxFOHPYaDeJkc0HBxcixBNxWL/NpWCerq47EHtvefDQcikU7RRfzSeP1LR +qRsbFplOJOV+qGZ+Mqj9M5IHEnuchE2b2Ijps4uWmiaSrNlbAtPZJK4GIlf2xKQY +90MCQArd+e/ORI0pYVXpc7kabgx/uxGyuO3sz/Y46LJ2rvgkavUDdnZwR1lhwVHL +sF315SZbdPfvOMjF2sG7IN35XRcyeVCSkMO7OWUPpDAYmSY+PXqVsWP9o90ahl/x +mTgufhZVVQFNW56+z/VzvPIphebfrvJN5oWMwWmsM46P+Rw1qBDd5fr/2Gu5mTYb +1vRjx3y6Sgu2YtCRgE/1M8oXg5Sk7ofUMjy+OzRtVzimvJXbQfK8jdkeJqIK9GVD +hqgi3p6fgCTZ1sUwFu0eJzm5uRhPtWq0gDm1YgWSZ9haPITUM3EwafpUQb5ERrtY +FDs00Btqk6pd0eoRfEUvhxkAqsMD1JShWfcMl99UOBBU3Mkz/cHF2YvntUWKs2yu +pU0nT6RpegkhrhVn+OyEbRJaF2TogMDHcCgO9hJACOHHiDCJ6BohoUD4Qkh/TDl7 +elwf+doZDDb+Zw1SoD+1vQ441O5lMXDtyOEheuPSOqduTkkzzSouckYe8q+OFJUs +uP38R73GM3yhUpGs5417DBEz1zNgERPuL0bB+io= +-----END CERTIFICATE----- diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/server.pem b/components/camel-knative/camel-knative-http/src/test/resources/keystore/server.pem new file mode 100644 index 00000000000..8877c464b31 --- /dev/null +++ b/components/camel-knative/camel-knative-http/src/test/resources/keystore/server.pem @@ -0,0 +1,85 @@ +-----BEGIN PRIVATE KEY----- +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 +ufGWwa/YYwPPR8un92ie1AEN/K/a +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFuTCCA6GgAwIBAgIBZDANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJERTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQ0wCwYDVQQDDARZQUtTMSgwJgYJKoZIhvcNAQkBFhl5YWtzLWRldkBn +b29nbGVncm91cHMuY29tMB4XDTI0MDYxODA3MDIxOFoXDTI1MDYwOTA3MDIxOFow +fjELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu +dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDENMAsGA1UEAwwEWUFLUzEoMCYGCSqGSIb3 +DQEJARYZeWFrcy1kZXZAZ29vZ2xlZ3JvdXBzLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBALkh1o/EuEk+Ag1pczYTZ3AUG3ka/FaDdkvoHHlAeFkw +5zpT+fcR5vPnPMyXcfo5UazInnehtiUv3gyUaNAmocZpKR3UtdJDLtLEduj2iZbA +xFgNKCYPJd6lf4xlBxzuNO0H7Rhh2rAFNqgFutpA3vQKqEDN5rnUsYcoybXvYsUx +duhvhitZAjNQI4zwGaonoYvZMkA+u/wV0tvixEvpdNEUJKPdpErBVnzfUBRzBjNU +XFyFqgqUEOPhVGz726Ngo66G6JWXK2FlHaxGE5oFsWi3o2JgwrEua/DQOqWSGbmW +kcBcifVvNrpX3MjBN4vl28MVVXw/raUSvBIOWoaCQNJZHHVBPvd+ApT5ZKCTXSQK +YguWIa2XN4IFm7ozSec7CXH1YwPt6DMmHBQYv3R3AzOMkIijhbhjjGyEnzRuricB +1GybCUG4oXMglJc8LqCOpvIshGi9ZHuiKCFFUSQopu5uJhbvXc88VKNVBsKUZG4D +uJTNExfmtZ6lCEAqxHcGUejHSasNtttXY8jqJyGK2IiFW6jap7jk9InySyo+qu+q +ziZDiVbJK3pQ3eHTZETL075t4ZMkDrnHX0zrUMg2wRGTmYN+xk1LwEByenX2vp/g +jAqtEPwtRbLFfsp1udhVJ7Y/FwpF18onfIYPqr6MwI3mfM65JfFJIDs/4IQ3SUB7 +AgMBAAGjQjBAMB0GA1UdDgQWBBSBbZ0v4XX4+5in6ZAKoMcogXHlgDAfBgNVHSME +GDAWgBSZfBQ9qjN35XGTAyXi79Wa7r0FQDANBgkqhkiG9w0BAQsFAAOCAgEAOgTV +2Omgu5uxFOHPYaDeJkc0HBxcixBNxWL/NpWCerq47EHtvefDQcikU7RRfzSeP1LR +qRsbFplOJOV+qGZ+Mqj9M5IHEnuchE2b2Ijps4uWmiaSrNlbAtPZJK4GIlf2xKQY +90MCQArd+e/ORI0pYVXpc7kabgx/uxGyuO3sz/Y46LJ2rvgkavUDdnZwR1lhwVHL +sF315SZbdPfvOMjF2sG7IN35XRcyeVCSkMO7OWUPpDAYmSY+PXqVsWP9o90ahl/x +mTgufhZVVQFNW56+z/VzvPIphebfrvJN5oWMwWmsM46P+Rw1qBDd5fr/2Gu5mTYb +1vRjx3y6Sgu2YtCRgE/1M8oXg5Sk7ofUMjy+OzRtVzimvJXbQfK8jdkeJqIK9GVD +hqgi3p6fgCTZ1sUwFu0eJzm5uRhPtWq0gDm1YgWSZ9haPITUM3EwafpUQb5ERrtY +FDs00Btqk6pd0eoRfEUvhxkAqsMD1JShWfcMl99UOBBU3Mkz/cHF2YvntUWKs2yu +pU0nT6RpegkhrhVn+OyEbRJaF2TogMDHcCgO9hJACOHHiDCJ6BohoUD4Qkh/TDl7 +elwf+doZDDb+Zw1SoD+1vQ441O5lMXDtyOEheuPSOqduTkkzzSouckYe8q+OFJUs +uP38R73GM3yhUpGs5417DBEz1zNgERPuL0bB+io= +-----END CERTIFICATE----- diff --git a/components/camel-knative/camel-knative-http/src/test/resources/keystore/truststore.jks b/components/camel-knative/camel-knative-http/src/test/resources/keystore/truststore.jks new file mode 100644 index 00000000000..3954a3f0670 Binary files /dev/null and b/components/camel-knative/camel-knative-http/src/test/resources/keystore/truststore.jks differ diff --git a/pom.xml b/pom.xml index d0b07ffebf3..e8ad4e5ac2c 100644 --- a/pom.xml +++ b/pom.xml @@ -272,6 +272,7 @@ <exclude>**/*.p12</exclude> <exclude>**/*.params</exclude> <exclude>**/*.parquet</exclude> + <exclude>**/*.crt</exclude> <exclude>**/*.pem</exclude> <exclude>**/*.pfx</exclude> <exclude>**/*.pgp</exclude>