From 04b2382ff501501289ab990d24d84ff15ddfed19 Mon Sep 17 00:00:00 2001 From: Christoph Deppisch Date: Mon, 21 Oct 2024 19:04:45 +0200 Subject: [PATCH] fix(#27): Enable SSL transport options on sources - Adds Http client SSL transport options - Uses options as a Camel bean and configures via environment variables when SSL is enabled - Enables SSL support on all sources --- README.adoc | 51 ++++++++ README.md | 3 - aws-ddb-streams-source/pom.xml | 6 + .../dev/knative/eventing/SourceOptions.java | 31 +++++ .../src/main/resources/application.properties | 3 + aws-s3-source/pom.xml | 6 + .../dev/knative/eventing/SourceOptions.java | 31 +++++ .../src/main/resources/application.properties | 3 + .../eventing/connector/AwsS3SourceTest.java | 6 +- .../connector/LocalstackTestResource.java | 16 ++- .../connector/ssl/AwsS3SourceSSLTest.java | 116 ++++++++++++++++++ .../src/test/resources/deployment.yaml | 28 ----- .../src/test/resources/keystore/client.crt | 33 +++++ .../src/test/resources/keystore/client.pem | 85 +++++++++++++ .../src/test/resources/keystore/server.jks | Bin 0 -> 4446 bytes .../test/resources/keystore/truststore.jks | Bin 0 -> 1531 bytes .../src/test/resources/sinkbinding.yaml | 20 --- aws-sqs-source/pom.xml | 6 + .../dev/knative/eventing/SourceOptions.java | 31 +++++ .../src/main/resources/application.properties | 3 + common/pom.xml | 22 ++++ common/utils/pom.xml | 27 ++++ .../source/KnativeHttpClientOptions.java | 108 ++++++++++++++++ pom.xml | 1 + timer-source/pom.xml | 6 + .../dev/knative/eventing/SourceOptions.java | 31 +++++ .../src/main/resources/application.properties | 3 + .../connector/ssl/DeploymentTestResource.java | 48 ++++++++ .../connector/ssl/TimerSourceSSLTest.java | 85 +++++++++++++ .../src/test/resources/keystore/client.crt | 33 +++++ .../src/test/resources/keystore/client.pem | 85 +++++++++++++ .../src/test/resources/keystore/server.jks | Bin 0 -> 4446 bytes .../test/resources/keystore/truststore.jks | Bin 0 -> 1531 bytes .../resources/archetype-resources/pom.xml | 6 + .../dev/knative/eventing/SourceOptions.java | 31 +++++ .../src/main/resources/application.properties | 3 + 36 files changed, 912 insertions(+), 55 deletions(-) delete mode 100644 README.md create mode 100644 aws-ddb-streams-source/src/main/java/dev/knative/eventing/SourceOptions.java create mode 100644 aws-s3-source/src/main/java/dev/knative/eventing/SourceOptions.java create mode 100644 aws-s3-source/src/test/java/dev/knative/eventing/connector/ssl/AwsS3SourceSSLTest.java delete mode 100644 aws-s3-source/src/test/resources/deployment.yaml create mode 100644 aws-s3-source/src/test/resources/keystore/client.crt create mode 100644 aws-s3-source/src/test/resources/keystore/client.pem create mode 100644 aws-s3-source/src/test/resources/keystore/server.jks create mode 100644 aws-s3-source/src/test/resources/keystore/truststore.jks delete mode 100644 aws-s3-source/src/test/resources/sinkbinding.yaml create mode 100644 aws-sqs-source/src/main/java/dev/knative/eventing/SourceOptions.java create mode 100644 common/pom.xml create mode 100644 common/utils/pom.xml create mode 100644 common/utils/src/main/java/dev/knative/eventing/source/KnativeHttpClientOptions.java create mode 100644 timer-source/src/main/java/dev/knative/eventing/SourceOptions.java create mode 100644 timer-source/src/test/java/dev/knative/eventing/connector/ssl/DeploymentTestResource.java create mode 100644 timer-source/src/test/java/dev/knative/eventing/connector/ssl/TimerSourceSSLTest.java create mode 100644 timer-source/src/test/resources/keystore/client.crt create mode 100644 timer-source/src/test/resources/keystore/client.pem create mode 100644 timer-source/src/test/resources/keystore/server.jks create mode 100644 timer-source/src/test/resources/keystore/truststore.jks create mode 100644 tools/archetype-source/src/main/resources/archetype-resources/src/main/java/dev/knative/eventing/SourceOptions.java diff --git a/README.adoc b/README.adoc index 3fe7df8..70b5230 100644 --- a/README.adoc +++ b/README.adoc @@ -368,6 +368,57 @@ spec: The trigger for example filters the events by its type `ce-type=dev.knative.connector.event.timer`. +== Secure Knative transports + +Knative brokers may use TLS encrypted transport options as described in https://knative.dev/docs/eventing/features/transport-encryption/#overview + +This means that Event producers need to use proper SSL authentication to connect to Https Knative broker endpoints with cluster-internal CA certificates. + +The IntegrationSource may use a volume mount with the cluster-internal CA certificates being injected. + +The integration source needs to enable the SSL client via environment variables and set the path to the injected CA certs and PEM files: + +* CAMEL_KNATIVE_CLIENT_SSL_ENABLED=true +* CAMEL_KNATIVE_CLIENT_SSL_KEY_PATH=/knative-custom-certs/knative-eventing-bundle.pem + +This enables the SSL options on the Http client that connects with the broker endpoint. The SSL client support provides these environment variables: + +|=== +|EnvVar |Description + +|CAMEL_KNATIVE_CLIENT_SSL_ENABLED +|Enable/disable SSL options on the Http client. Default value is `false`. + +|CAMEL_KNATIVE_CLIENT_SSL_VERIFY_HOSTNAME +|Enable/disable hostname verification. Default value is `true`. + +|CAMEL_KNATIVE_CLIENT_SSL_KEY_PATH +|Path to the key store options configuring a list of private key and its certificate based on Privacy-enhanced Electronic Email (PEM) files. + +|CAMEL_KNATIVE_CLIENT_SSL_KEY_CERT_PATH +|Optional path to the client certificate in case the CA cert is not included in the key PEM file. + +|CAMEL_KNATIVE_CLIENT_SSL_KEYSTORE_PATH +|Java keystore (.jks) or (.p12) path as an alternative to using PEM files. + +|CAMEL_KNATIVE_CLIENT_SSL_KEYSTORE_PASSWORD +|Keystore password. Value can be set via secretKeyRef. + +|CAMEL_KNATIVE_CLIENT_SSL_TRUST_CERT_PATH +|Path to the trust certificate provided as a PEM file. + +|CAMEL_KNATIVE_CLIENT_SSL_TRUSTSTORE_PATH +|Java truststore (.jks) or (.p12) path as an alternative to using PEM files. + +|CAMEL_KNATIVE_CLIENT_SSL_TRUSTSTORE_PASSWORD +|Truststore password. Value can be set via secretKeyRef. + +|=== + +As you can see the SSL client support provides multiple ways to configure keystore and truststore options. +It is recommended to set keystore/truststore passwords vie secretKeyRef on the IntegrationSource spec. +When no truststore configuration is given the SSL client support defaults to using trust all options. + == Dependencies The required Camel dependencies need to be added to the Maven POM before building and deploying. diff --git a/README.md b/README.md deleted file mode 100644 index 19cada1..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Eventing Integrations - -Eventing integration container images \ No newline at end of file diff --git a/aws-ddb-streams-source/pom.xml b/aws-ddb-streams-source/pom.xml index 057a652..59af136 100644 --- a/aws-ddb-streams-source/pom.xml +++ b/aws-ddb-streams-source/pom.xml @@ -15,6 +15,12 @@ Knative Connectors :: AWS DDB Streams Source + + dev.knative.eventing + connector-utils + ${project.version} + + org.apache.camel.quarkus camel-quarkus-core diff --git a/aws-ddb-streams-source/src/main/java/dev/knative/eventing/SourceOptions.java b/aws-ddb-streams-source/src/main/java/dev/knative/eventing/SourceOptions.java new file mode 100644 index 0000000..490fcb1 --- /dev/null +++ b/aws-ddb-streams-source/src/main/java/dev/knative/eventing/SourceOptions.java @@ -0,0 +1,31 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing; + +import dev.knative.eventing.source.KnativeHttpClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Named; +import org.apache.camel.CamelContext; + +@ApplicationScoped +public class SourceOptions { + + @Named("knativeHttpClientOptions") + public KnativeHttpClientOptions knativeHttpClientOptions(CamelContext camelContext) { + return new KnativeHttpClientOptions(camelContext); + } +} diff --git a/aws-ddb-streams-source/src/main/resources/application.properties b/aws-ddb-streams-source/src/main/resources/application.properties index 9f63c65..adeb9a4 100644 --- a/aws-ddb-streams-source/src/main/resources/application.properties +++ b/aws-ddb-streams-source/src/main/resources/application.properties @@ -37,3 +37,6 @@ camel.kamelet.aws-ddb-streams-source.table= # ConfigMap and secret based configuration camel.kubernetes-config.mount-path-configmaps=/etc/camel/conf.d/_configmaps/kn-source-config camel.kubernetes-config.mount-path-secrets=/etc/camel/conf.d/_secrets/kn-source-config + +# Http transport configuration (SSL enabled) +camel.component.knative.producerFactory.clientOptions=#bean:knativeHttpClientOptions diff --git a/aws-s3-source/pom.xml b/aws-s3-source/pom.xml index 65ac7d5..6143f6f 100644 --- a/aws-s3-source/pom.xml +++ b/aws-s3-source/pom.xml @@ -15,6 +15,12 @@ Knative Connectors :: AWS S3 Source + + dev.knative.eventing + connector-utils + ${project.version} + + org.apache.camel.quarkus camel-quarkus-core diff --git a/aws-s3-source/src/main/java/dev/knative/eventing/SourceOptions.java b/aws-s3-source/src/main/java/dev/knative/eventing/SourceOptions.java new file mode 100644 index 0000000..490fcb1 --- /dev/null +++ b/aws-s3-source/src/main/java/dev/knative/eventing/SourceOptions.java @@ -0,0 +1,31 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing; + +import dev.knative.eventing.source.KnativeHttpClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Named; +import org.apache.camel.CamelContext; + +@ApplicationScoped +public class SourceOptions { + + @Named("knativeHttpClientOptions") + public KnativeHttpClientOptions knativeHttpClientOptions(CamelContext camelContext) { + return new KnativeHttpClientOptions(camelContext); + } +} diff --git a/aws-s3-source/src/main/resources/application.properties b/aws-s3-source/src/main/resources/application.properties index 4eb9d94..193277a 100644 --- a/aws-s3-source/src/main/resources/application.properties +++ b/aws-s3-source/src/main/resources/application.properties @@ -38,3 +38,6 @@ camel.kamelet.aws-s3-source.bucketNameOrArn= # ConfigMap and secret based configuration camel.kubernetes-config.mount-path-configmaps=/etc/camel/conf.d/_configmaps/kn-source-config camel.kubernetes-config.mount-path-secrets=/etc/camel/conf.d/_secrets/kn-source-config + +# Http transport configuration (SSL enabled) +camel.component.knative.producerFactory.clientOptions=#bean:knativeHttpClientOptions diff --git a/aws-s3-source/src/test/java/dev/knative/eventing/connector/AwsS3SourceTest.java b/aws-s3-source/src/test/java/dev/knative/eventing/connector/AwsS3SourceTest.java index 27c12ff..949a2d9 100644 --- a/aws-s3-source/src/test/java/dev/knative/eventing/connector/AwsS3SourceTest.java +++ b/aws-s3-source/src/test/java/dev/knative/eventing/connector/AwsS3SourceTest.java @@ -19,11 +19,13 @@ import java.util.Collections; import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.ResourceArg; import io.quarkus.test.junit.QuarkusTest; import org.citrusframework.GherkinTestActionRunner; import org.citrusframework.annotations.CitrusResource; import org.citrusframework.context.TestContext; import org.citrusframework.http.endpoint.builder.HttpEndpoints; +import org.citrusframework.http.security.HttpSecureConnection; import org.citrusframework.http.server.HttpServer; import org.citrusframework.quarkus.CitrusSupport; import org.citrusframework.spi.BindToRegistry; @@ -39,7 +41,9 @@ @QuarkusTest @CitrusSupport -@QuarkusTestResource(LocalstackTestResource.class) +@QuarkusTestResource(value = LocalstackTestResource.class, restrictToAnnotatedClass = true, initArgs = { + @ResourceArg(name = "bucketNameOrArn", value = "mybucket") +}) public class AwsS3SourceTest { @CitrusResource diff --git a/aws-s3-source/src/test/java/dev/knative/eventing/connector/LocalstackTestResource.java b/aws-s3-source/src/test/java/dev/knative/eventing/connector/LocalstackTestResource.java index 19bb86b..6fe429b 100644 --- a/aws-s3-source/src/test/java/dev/knative/eventing/connector/LocalstackTestResource.java +++ b/aws-s3-source/src/test/java/dev/knative/eventing/connector/LocalstackTestResource.java @@ -35,6 +35,13 @@ public class LocalstackTestResource implements QuarkusTestResourceLifecycleManag private S3Client s3Client; + private final Map injectedConf = new HashMap<>(); + + @Override + public void init(Map initArgs) { + injectedConf.putAll(initArgs); + } + @Override public Map start() { localStackContainer.start(); @@ -50,17 +57,20 @@ public Map start() { .region(Region.of(localStackContainer.getRegion())) .build(); - s3Client.createBucket(b -> b.bucket("mybucket")); + String bucketNameOrArn = injectedConf.remove("bucketNameOrArn"); + s3Client.createBucket(b -> b.bucket(bucketNameOrArn)); Map conf = new HashMap<>(); conf.put("camel.kamelet.aws-s3-source.accessKey", localStackContainer.getAccessKey()); conf.put("camel.kamelet.aws-s3-source.secretKey", localStackContainer.getSecretKey()); conf.put("camel.kamelet.aws-s3-source.region", localStackContainer.getRegion()); - conf.put("camel.kamelet.aws-s3-source.bucketNameOrArn", "mybucket"); + conf.put("camel.kamelet.aws-s3-source.bucketNameOrArn", bucketNameOrArn); conf.put("camel.kamelet.aws-s3-source.uriEndpointOverride", localStackContainer.getEndpoint().toString()); conf.put("camel.kamelet.aws-s3-source.overrideEndpoint", "true"); conf.put("camel.kamelet.aws-s3-source.forcePathStyle", "true"); + conf.putAll(injectedConf); + return conf; } @@ -80,6 +90,6 @@ public void inject(TestInjector testInjector) { /** * Annotation marks fields in test class for injection by this test resource. */ - @interface Injected { + public @interface Injected { } } diff --git a/aws-s3-source/src/test/java/dev/knative/eventing/connector/ssl/AwsS3SourceSSLTest.java b/aws-s3-source/src/test/java/dev/knative/eventing/connector/ssl/AwsS3SourceSSLTest.java new file mode 100644 index 0000000..38f3e12 --- /dev/null +++ b/aws-s3-source/src/test/java/dev/knative/eventing/connector/ssl/AwsS3SourceSSLTest.java @@ -0,0 +1,116 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing.connector.ssl; + +import java.util.Collections; + +import dev.knative.eventing.connector.LocalstackTestResource; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.ResourceArg; +import io.quarkus.test.junit.QuarkusTest; +import org.citrusframework.GherkinTestActionRunner; +import org.citrusframework.annotations.CitrusResource; +import org.citrusframework.context.TestContext; +import org.citrusframework.http.endpoint.builder.HttpEndpoints; +import org.citrusframework.http.security.HttpSecureConnection; +import org.citrusframework.http.server.HttpServer; +import org.citrusframework.quarkus.CitrusSupport; +import org.citrusframework.spi.BindToRegistry; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; +import software.amazon.awssdk.services.s3.model.CompletedPart; +import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse; + +import static org.citrusframework.http.actions.HttpActionBuilder.http; + +@QuarkusTest +@CitrusSupport +@QuarkusTestResource(value = LocalstackTestResource.class, restrictToAnnotatedClass = true, initArgs = { + @ResourceArg(name = "bucketNameOrArn", value = "mybucket"), + @ResourceArg(name = "k.sink", value = "https://localhost:8443"), + @ResourceArg(name = "camel.knative.client.ssl.enabled", value = "true"), + @ResourceArg(name = "camel.knative.client.ssl.verify.hostname", value = "false"), + @ResourceArg(name = "camel.knative.client.ssl.key.path", value = "keystore/client.pem"), + @ResourceArg(name = "camel.knative.client.ssl.key.cert.path", value = "keystore/client.crt"), + @ResourceArg(name = "camel.knative.client.ssl.truststore.path", value = "keystore/truststore.jks"), + @ResourceArg(name = "camel.knative.client.ssl.truststore.password", value = "secr3t") +}) +public class AwsS3SourceSSLTest { + + @CitrusResource + private GherkinTestActionRunner tc; + + private final String s3Key = "message.txt"; + private final String s3Data = "Hello from secured AWS S3!"; + private final String s3BucketName = "mybucket"; + + @LocalstackTestResource.Injected + public S3Client s3Client; + + @BindToRegistry + public HttpServer knativeBroker = HttpEndpoints.http() + .server() + .port(8080) + .securePort(8443) + .secured(HttpSecureConnection.ssl() + .keyStore("classpath:keystore/server.jks", "secr3t") + .trustStore("classpath:keystore/truststore.jks", "secr3t")) + .autoStart(true) + .build(); + + @Test + public void shouldProduceSecureEvents() { + tc.given(this::uploadS3File); + + tc.when( + http().server(knativeBroker) + .receive() + .post() + .message() + .body(s3Data) + .header("ce-id", "@matches([0-9A-Z]{15}-[0-9]{16})@") + .header("ce-type", "dev.knative.connector.event.aws-s3") + .header("ce-source", "dev.knative.eventing.aws-s3-source") + .header("ce-subject", "aws-s3-source") + ); + + tc.then( + http().server(knativeBroker) + .send() + .response(HttpStatus.OK) + ); + } + + private void uploadS3File(TestContext context) { + CreateMultipartUploadResponse initResponse = s3Client.createMultipartUpload(b -> b.bucket(s3BucketName).key(s3Key)); + String etag = s3Client.uploadPart(b -> b.bucket(s3BucketName) + .key(s3Key) + .uploadId(initResponse.uploadId()) + .partNumber(1), + RequestBody.fromString(s3Data)).eTag(); + s3Client.completeMultipartUpload(b -> b.bucket(s3BucketName) + .multipartUpload(CompletedMultipartUpload.builder() + .parts(Collections.singletonList(CompletedPart.builder() + .partNumber(1) + .eTag(etag).build())).build()) + .key(s3Key) + .uploadId(initResponse.uploadId())); + } +} diff --git a/aws-s3-source/src/test/resources/deployment.yaml b/aws-s3-source/src/test/resources/deployment.yaml deleted file mode 100644 index 600a721..0000000 --- a/aws-s3-source/src/test/resources/deployment.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - eventing.knative.dev/connector: aws-s3-source - name: kn-connector-aws-s3-source -spec: - selector: - matchLabels: - eventing.knative.dev/connector: aws-s3-source - template: - metadata: - labels: - eventing.knative.dev/connector: aws-s3-source - spec: - containers: - - name: kn-connector-aws-s3-source - image: localhost:5001/openshift-knative/kn-connector-aws-s3-source:1.0-SNAPSHOT - imagePullPolicy: Always - env: - - name: CAMEL_KAMELET_AWS_S3_SOURCE_BUCKETNAMEORARN - value: "${aws.s3.bucketName}" - - name: CAMEL_KAMELET_AWS_S3_SOURCE_ACCESSKEY - value: "${aws.s3.accessKey}" - - name: CAMEL_KAMELET_AWS_S3_SOURCE_SECRETKEY - value: "${aws.s3.secretKey}" - - name: CAMEL_KAMELET_AWS_S3_SOURCE_REGION - value: "${aws.s3.region}" diff --git a/aws-s3-source/src/test/resources/keystore/client.crt b/aws-s3-source/src/test/resources/keystore/client.crt new file mode 100644 index 0000000..b2cc0e1 --- /dev/null +++ b/aws-s3-source/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/aws-s3-source/src/test/resources/keystore/client.pem b/aws-s3-source/src/test/resources/keystore/client.pem new file mode 100644 index 0000000..f7b981d --- /dev/null +++ b/aws-s3-source/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/aws-s3-source/src/test/resources/keystore/server.jks b/aws-s3-source/src/test/resources/keystore/server.jks new file mode 100644 index 0000000000000000000000000000000000000000..a9af9b34a52d4911951b7b0137c4f236bd37ce36 GIT binary patch literal 4446 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 PB1Cp*?h5$-PS$?`3*|ax literal 0 HcmV?d00001 diff --git a/aws-s3-source/src/test/resources/keystore/truststore.jks b/aws-s3-source/src/test/resources/keystore/truststore.jks new file mode 100644 index 0000000000000000000000000000000000000000..3954a3f06701207b84b4274cc24373eafafd1357 GIT binary patch literal 1531 zcmezO_TO6u1_mY|W(3o$xs}?;Nc3+&rQ`0E=ep& zHB>Z^2MKcVNO{Ptge`JTJ9TRV6v6*msfrxaa)Ss~C zGVd2Ml@1k=2G6a6e|{Hy_W8NZndybUECbh^m{-1Vo2vdjo+%j@)D|Ag)Reul^^&vR zr6Xl8zI9GJa3q3PLycec-qQM>RCbwnCU4o_N+jOez-qRFb=NJ2dtbO#IGla9^UB6{ zjgwp7Cml5`dy(I!9m!-IpxpC8a+UhR?wdvqcDw(GUb_A0i1*8qiy|tE?=JB=7*=yX zK%|(>I3y;fbrshXfyWO+a(>@loUnLZ+l#5wwG&fi*SHDKV%?areQ{F4p^bXkA1+ue zog}$)+Qb7fonQ0Kc7@+LanQW`>FvX!p*8kvmkR9>;)`l)a<~*JQ|f5?wQcBxOGQzPfp8xle~56 zj8}4Ib2{!=SgbH*x{cm~zGa_uS~B*gR4>v{bPZI|SoSVYP3(Q_d7F^Mp=^hyq~tO0 zm~vKF{MpudOF100j+C8m^gsN||7w2-leoDQjjepg?o&&wlYR>Ic{phJ+ZU3Of+|!|&iJ6gs zaj}zugMlnC1IY5Rh_Q$?=FZiBSo-7ljO8yUa4k5l(OCGj0i1|Ku%@Aj0sF-j0{#RS8u#ruzU7Kk%#9K7u-{GH<6Kv=@#%k zn)KgnYE#v&9d8`p?tOmP@x+qgErInW^X!8zu9TJ*o9UB)w_>_3_lqK)luNc|v zvo^^Mw^+7k>TSnQdwOrmsV(CAlIq;HLh0VT`3)*JuN^fIdn>1IxpSw4|JJN64VGJz zSSO|5h_Y$9Vq9pD`76Y6pNre>2oYM-+_DGMXN^Gv@V zVj&Q6=cMu9gGX<6Ki}%wwK-?qQeSodC7D&6it9wvf4phQ6^as1dC_p-c!37rHz5a( zhsQe%I$uaBE_C?eKnative Connectors :: AWS SQS Source + + dev.knative.eventing + connector-utils + ${project.version} + + org.apache.camel.quarkus camel-quarkus-core diff --git a/aws-sqs-source/src/main/java/dev/knative/eventing/SourceOptions.java b/aws-sqs-source/src/main/java/dev/knative/eventing/SourceOptions.java new file mode 100644 index 0000000..490fcb1 --- /dev/null +++ b/aws-sqs-source/src/main/java/dev/knative/eventing/SourceOptions.java @@ -0,0 +1,31 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing; + +import dev.knative.eventing.source.KnativeHttpClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Named; +import org.apache.camel.CamelContext; + +@ApplicationScoped +public class SourceOptions { + + @Named("knativeHttpClientOptions") + public KnativeHttpClientOptions knativeHttpClientOptions(CamelContext camelContext) { + return new KnativeHttpClientOptions(camelContext); + } +} diff --git a/aws-sqs-source/src/main/resources/application.properties b/aws-sqs-source/src/main/resources/application.properties index 61942fa..f473644 100644 --- a/aws-sqs-source/src/main/resources/application.properties +++ b/aws-sqs-source/src/main/resources/application.properties @@ -37,3 +37,6 @@ camel.kamelet.aws-sqs-source.queueNameOrArn= # ConfigMap and secret based configuration camel.kubernetes-config.mount-path-configmaps=/etc/camel/conf.d/_configmaps/kn-source-config camel.kubernetes-config.mount-path-secrets=/etc/camel/conf.d/_secrets/kn-source-config + +# Http transport configuration (SSL enabled) +camel.component.knative.producerFactory.clientOptions=#bean:knativeHttpClientOptions diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..3ed9d46 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,22 @@ + + + + 4.0.0 + + + dev.knative.eventing + connectors + 1.0-SNAPSHOT + ../pom.xml + + + connector-common + Knative Connectors :: Common + pom + + + utils + + + diff --git a/common/utils/pom.xml b/common/utils/pom.xml new file mode 100644 index 0000000..ed1de77 --- /dev/null +++ b/common/utils/pom.xml @@ -0,0 +1,27 @@ + + + + 4.0.0 + + + dev.knative.eventing + connector-common + 1.0-SNAPSHOT + ../pom.xml + + + connector-utils + Knative Connectors :: Common :: Utils + + + + org.apache.camel.quarkus + camel-quarkus-core + + + org.apache.camel.quarkus + camel-quarkus-knative + + + diff --git a/common/utils/src/main/java/dev/knative/eventing/source/KnativeHttpClientOptions.java b/common/utils/src/main/java/dev/knative/eventing/source/KnativeHttpClientOptions.java new file mode 100644 index 0000000..5ba7f93 --- /dev/null +++ b/common/utils/src/main/java/dev/knative/eventing/source/KnativeHttpClientOptions.java @@ -0,0 +1,108 @@ +package dev.knative.eventing.source; + +import io.quarkus.tls.runtime.keystores.TrustAllOptions; +import io.vertx.core.net.JksOptions; +import io.vertx.core.net.PemKeyCertOptions; +import io.vertx.core.net.PemTrustOptions; +import io.vertx.core.net.PfxOptions; +import io.vertx.ext.web.client.WebClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Named; +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.PropertiesComponent; +import org.apache.camel.support.ObjectHelper; + +/** + * Knative client options able to configure secure Http transport options. + * SSL options are added automatically when enabled via system property or environment variable settings. + */ +public class KnativeHttpClientOptions extends WebClientOptions implements CamelContextAware { + + private static final String PROPERTY_PREFIX = "camel.knative.client.ssl."; + + private CamelContext camelContext; + + public KnativeHttpClientOptions() { + } + + public KnativeHttpClientOptions(CamelContext camelContext) { + this.camelContext = camelContext; + configureOptions(camelContext); + } + + public void configureOptions() { + if (camelContext == null) { + throw new RuntimeCamelException("Missing Camel context for Knative Http client options"); + } + + configureOptions(camelContext); + } + + /** + * Configures this web client options instance based on properties and environment variables resolved with the given Camel context. + * @param camelContext + */ + public void configureOptions(CamelContext camelContext) { + PropertiesComponent propertiesComponent = camelContext.getPropertiesComponent(); + + boolean sslEnabled = Boolean.parseBoolean( + propertiesComponent.resolveProperty(PROPERTY_PREFIX + "enabled").orElse("false")); + + if (sslEnabled) { + this.setSsl(true); + + boolean verifyHostname = Boolean.parseBoolean( + propertiesComponent.resolveProperty(PROPERTY_PREFIX + "verify.hostname").orElse("true")); + this.setVerifyHost(verifyHostname); + + String keystorePath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "keystore.path").orElse(""); + String keystorePassword = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "keystore.password").orElse(""); + + if (!keystorePath.isEmpty()) { + if (keystorePath.endsWith(".p12")) { + this.setKeyCertOptions(new PfxOptions().setPath(keystorePath).setPassword(keystorePassword)); + } else { + this.setKeyCertOptions(new JksOptions().setPath(keystorePath).setPassword(keystorePassword)); + } + } else { + String keyPath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "key.path").orElse(""); + String keyCertPath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "key.cert.path").orElse(keyPath); + + if (!keyPath.isEmpty()) { + this.setKeyCertOptions(new PemKeyCertOptions().setKeyPath(keyPath).setCertPath(keyCertPath)); + } + } + + String truststorePath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "truststore.path").orElse(""); + String truststorePassword = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "truststore.password").orElse(""); + + if (!truststorePath.isEmpty()) { + if (truststorePath.endsWith(".p12")) { + this.setTrustOptions(new PfxOptions().setPath(truststorePath).setPassword(truststorePassword)); + } else { + this.setTrustOptions(new JksOptions().setPath(truststorePath).setPassword(truststorePassword)); + } + } else { + String trustCertPath = propertiesComponent.resolveProperty(PROPERTY_PREFIX + "trust.cert.path").orElse(""); + + if (!trustCertPath.isEmpty()) { + this.setTrustOptions(new PemTrustOptions().addCertPath(trustCertPath)); + } else { + this.setTrustOptions(TrustAllOptions.INSTANCE); + } + } + } + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } +} diff --git a/pom.xml b/pom.xml index e603578..792c725 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ tools + common timer-source aws-s3-source aws-sqs-source diff --git a/timer-source/pom.xml b/timer-source/pom.xml index 34e8d23..2ca4055 100644 --- a/timer-source/pom.xml +++ b/timer-source/pom.xml @@ -15,6 +15,12 @@ Knative Connectors :: Timer Source + + dev.knative.eventing + connector-utils + ${project.version} + + org.apache.camel.quarkus camel-quarkus-core diff --git a/timer-source/src/main/java/dev/knative/eventing/SourceOptions.java b/timer-source/src/main/java/dev/knative/eventing/SourceOptions.java new file mode 100644 index 0000000..490fcb1 --- /dev/null +++ b/timer-source/src/main/java/dev/knative/eventing/SourceOptions.java @@ -0,0 +1,31 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing; + +import dev.knative.eventing.source.KnativeHttpClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Named; +import org.apache.camel.CamelContext; + +@ApplicationScoped +public class SourceOptions { + + @Named("knativeHttpClientOptions") + public KnativeHttpClientOptions knativeHttpClientOptions(CamelContext camelContext) { + return new KnativeHttpClientOptions(camelContext); + } +} diff --git a/timer-source/src/main/resources/application.properties b/timer-source/src/main/resources/application.properties index 4db0c28..bd9efa4 100644 --- a/timer-source/src/main/resources/application.properties +++ b/timer-source/src/main/resources/application.properties @@ -35,3 +35,6 @@ camel.kamelet.timer-source.period=1000 # ConfigMap and secret based configuration camel.kubernetes-config.mount-path-configmaps=/etc/camel/conf.d/_configmaps/kn-source-config camel.kubernetes-config.mount-path-secrets=/etc/camel/conf.d/_secrets/kn-source-config + +# Http transport configuration (SSL enabled) +camel.component.knative.producerFactory.clientOptions=#bean:knativeHttpClientOptions diff --git a/timer-source/src/test/java/dev/knative/eventing/connector/ssl/DeploymentTestResource.java b/timer-source/src/test/java/dev/knative/eventing/connector/ssl/DeploymentTestResource.java new file mode 100644 index 0000000..ba2b98d --- /dev/null +++ b/timer-source/src/test/java/dev/knative/eventing/connector/ssl/DeploymentTestResource.java @@ -0,0 +1,48 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing.connector.ssl; + +import java.util.HashMap; +import java.util.Map; + +import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; + +public class DeploymentTestResource implements QuarkusTestResourceLifecycleManager { + + private final Map injectedConf = new HashMap<>(); + + @Override + public void init(Map initArgs) { + injectedConf.putAll(initArgs); + } + + @Override + public Map start() { + Map conf = new HashMap<>(); + + String message = injectedConf.remove("message"); + conf.put("camel.kamelet.timer-source.message", message); + + conf.putAll(injectedConf); + + return conf; + } + + @Override + public void stop() { + } +} diff --git a/timer-source/src/test/java/dev/knative/eventing/connector/ssl/TimerSourceSSLTest.java b/timer-source/src/test/java/dev/knative/eventing/connector/ssl/TimerSourceSSLTest.java new file mode 100644 index 0000000..9fe9bac --- /dev/null +++ b/timer-source/src/test/java/dev/knative/eventing/connector/ssl/TimerSourceSSLTest.java @@ -0,0 +1,85 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing.connector.ssl; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.ResourceArg; +import io.quarkus.test.junit.QuarkusTest; +import org.citrusframework.GherkinTestActionRunner; +import org.citrusframework.annotations.CitrusResource; +import org.citrusframework.http.endpoint.builder.HttpEndpoints; +import org.citrusframework.http.security.HttpSecureConnection; +import org.citrusframework.http.server.HttpServer; +import org.citrusframework.quarkus.CitrusSupport; +import org.citrusframework.spi.BindToRegistry; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +import static org.citrusframework.http.actions.HttpActionBuilder.http; + +@QuarkusTest +@CitrusSupport +@QuarkusTestResource(value = DeploymentTestResource.class, restrictToAnnotatedClass = true, initArgs = { + @ResourceArg(name = "message", value = "Hello from timer-source!"), + @ResourceArg(name = "k.sink", value = "https://localhost:8443"), + @ResourceArg(name = "camel.knative.client.ssl.enabled", value = "true"), + @ResourceArg(name = "camel.knative.client.ssl.verify.hostname", value = "false"), + @ResourceArg(name = "camel.knative.client.ssl.key.path", value = "keystore/client.pem"), + @ResourceArg(name = "camel.knative.client.ssl.key.cert.path", value = "keystore/client.crt"), + @ResourceArg(name = "camel.knative.client.ssl.truststore.path", value = "keystore/truststore.jks"), + @ResourceArg(name = "camel.knative.client.ssl.truststore.password", value = "secr3t") +}) +public class TimerSourceSSLTest { + + @CitrusResource + private GherkinTestActionRunner tc; + + @BindToRegistry + public HttpServer knativeBroker = HttpEndpoints.http() + .server() + .port(8080) + .securePort(8443) + .secured(HttpSecureConnection.ssl() + .keyStore("classpath:keystore/server.jks", "secr3t") + .trustStore("classpath:keystore/truststore.jks", "secr3t")) + .autoStart(true) + .build(); + + @Test + public void shouldProduceEvents() { + String message = "Hello from timer-source!"; + + tc.when( + http().server(knativeBroker) + .receive() + .post() + .message() + .body(message) + .header("ce-id", "@matches([0-9A-Z]{15}-[0-9]{16})@") + .header("ce-type", "dev.knative.connector.event.timer") + .header("ce-source", "dev.knative.eventing.timer-source") + .header("ce-subject", "timer-source") + ); + + tc.then( + http().server(knativeBroker) + .send() + .response(HttpStatus.OK) + ); + } + +} diff --git a/timer-source/src/test/resources/keystore/client.crt b/timer-source/src/test/resources/keystore/client.crt new file mode 100644 index 0000000..b2cc0e1 --- /dev/null +++ b/timer-source/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/timer-source/src/test/resources/keystore/client.pem b/timer-source/src/test/resources/keystore/client.pem new file mode 100644 index 0000000..f7b981d --- /dev/null +++ b/timer-source/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/timer-source/src/test/resources/keystore/server.jks b/timer-source/src/test/resources/keystore/server.jks new file mode 100644 index 0000000000000000000000000000000000000000..a9af9b34a52d4911951b7b0137c4f236bd37ce36 GIT binary patch literal 4446 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 PB1Cp*?h5$-PS$?`3*|ax literal 0 HcmV?d00001 diff --git a/timer-source/src/test/resources/keystore/truststore.jks b/timer-source/src/test/resources/keystore/truststore.jks new file mode 100644 index 0000000000000000000000000000000000000000..3954a3f06701207b84b4274cc24373eafafd1357 GIT binary patch literal 1531 zcmezO_TO6u1_mY|W(3o$xs}?;Nc3+&rQ`0E=ep& zHB>Z^2MKcVNO{Ptge`JTJ9TRV6v6*msfrxaa)Ss~C zGVd2Ml@1k=2G6a6e|{Hy_W8NZndybUECbh^m{-1Vo2vdjo+%j@)D|Ag)Reul^^&vR zr6Xl8zI9GJa3q3PLycec-qQM>RCbwnCU4o_N+jOez-qRFb=NJ2dtbO#IGla9^UB6{ zjgwp7Cml5`dy(I!9m!-IpxpC8a+UhR?wdvqcDw(GUb_A0i1*8qiy|tE?=JB=7*=yX zK%|(>I3y;fbrshXfyWO+a(>@loUnLZ+l#5wwG&fi*SHDKV%?areQ{F4p^bXkA1+ue zog}$)+Qb7fonQ0Kc7@+LanQW`>FvX!p*8kvmkR9>;)`l)a<~*JQ|f5?wQcBxOGQzPfp8xle~56 zj8}4Ib2{!=SgbH*x{cm~zGa_uS~B*gR4>v{bPZI|SoSVYP3(Q_d7F^Mp=^hyq~tO0 zm~vKF{MpudOF100j+C8m^gsN||7w2-leoDQjjepg?o&&wlYR>Ic{phJ+ZU3Of+|!|&iJ6gs zaj}zugMlnC1IY5Rh_Q$?=FZiBSo-7ljO8yUa4k5l(OCGj0i1|Ku%@Aj0sF-j0{#RS8u#ruzU7Kk%#9K7u-{GH<6Kv=@#%k zn)KgnYE#v&9d8`p?tOmP@x+qgErInW^X!8zu9TJ*o9UB)w_>_3_lqK)luNc|v zvo^^Mw^+7k>TSnQdwOrmsV(CAlIq;HLh0VT`3)*JuN^fIdn>1IxpSw4|JJN64VGJz zSSO|5h_Y$9Vq9pD`76Y6pNre>2oYM-+_DGMXN^Gv@V zVj&Q6=cMu9gGX<6Ki}%wwK-?qQeSodC7D&6it9wvf4phQ6^as1dC_p-c!37rHz5a( zhsQe%I$uaBE_C?eKnative Connectors :: ${kamelet-name} Source + + dev.knative.eventing + connector-utils + ${project.version} + + org.apache.camel.quarkus camel-quarkus-core diff --git a/tools/archetype-source/src/main/resources/archetype-resources/src/main/java/dev/knative/eventing/SourceOptions.java b/tools/archetype-source/src/main/resources/archetype-resources/src/main/java/dev/knative/eventing/SourceOptions.java new file mode 100644 index 0000000..490fcb1 --- /dev/null +++ b/tools/archetype-source/src/main/resources/archetype-resources/src/main/java/dev/knative/eventing/SourceOptions.java @@ -0,0 +1,31 @@ +/* + * Copyright the original author or authors. + * + * Licensed 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 dev.knative.eventing; + +import dev.knative.eventing.source.KnativeHttpClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Named; +import org.apache.camel.CamelContext; + +@ApplicationScoped +public class SourceOptions { + + @Named("knativeHttpClientOptions") + public KnativeHttpClientOptions knativeHttpClientOptions(CamelContext camelContext) { + return new KnativeHttpClientOptions(camelContext); + } +} diff --git a/tools/archetype-source/src/main/resources/archetype-resources/src/main/resources/application.properties b/tools/archetype-source/src/main/resources/archetype-resources/src/main/resources/application.properties index 94a6c47..904f132 100644 --- a/tools/archetype-source/src/main/resources/archetype-resources/src/main/resources/application.properties +++ b/tools/archetype-source/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -33,3 +33,6 @@ camel.component.knative.ceOverride[ce-subject]={{kn.connector.ce.override.subjec # ConfigMap and secret based configuration camel.kubernetes-config.mount-path-configmaps=/etc/camel/conf.d/_configmaps/kn-source-config camel.kubernetes-config.mount-path-secrets=/etc/camel/conf.d/_secrets/kn-source-config + +# Http transport configuration (SSL enabled) +camel.component.knative.producerFactory.clientOptions=#bean:knativeHttpClientOptions