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>

Reply via email to