This is an automated email from the ASF dual-hosted git repository. oscerd pushed a commit to branch fix/CAMEL-23446 in repository https://gitbox.apache.org/repos/asf/camel.git
commit f3842d149eb9b711fc4a659955692782a2cfba1c Author: Andrea Cosentino <[email protected]> AuthorDate: Thu Jun 11 10:49:19 2026 +0200 CAMEL-23446: camel-solr - Add SSLContextParameters support for TLS configuration Add SSLContextParameters support to camel-solr so TLS can be configured with fine-grained control (named groups, signature schemes, cipher suites and protocols), e.g. post-quantum named groups such as X25519MLKEM768 on JDK 25+. SolrComponent now implements SSLContextParametersAware with a global SSLContextParameters fallback, and SolrEndpoint builds the SSLContext from SSLContextParameters when configured, keeping the existing certificatePath (CA-only) path as a fallback. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Signed-off-by: Andrea Cosentino <[email protected]> --- .../org/apache/camel/catalog/components/solr.json | 7 +- .../component/solr/SolrComponentConfigurer.java | 12 ++ .../component/solr/SolrEndpointConfigurer.java | 6 + .../component/solr/SolrEndpointUriFactory.java | 3 +- .../org/apache/camel/component/solr/solr.json | 7 +- .../apache/camel/component/solr/SolrComponent.java | 38 ++++++- .../camel/component/solr/SolrConfiguration.java | 16 +++ .../apache/camel/component/solr/SolrEndpoint.java | 20 +++- .../solr/SolrSslContextParametersTest.java | 121 +++++++++++++++++++++ .../component/dsl/SolrComponentBuilderFactory.java | 36 ++++++ .../endpoint/dsl/SolrEndpointBuilderFactory.java | 36 ++++++ 11 files changed, 295 insertions(+), 7 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json index 0d901e133223..623455d38f80 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json @@ -34,7 +34,9 @@ "solrClient": { "index": 7, "kind": "property", "displayName": "Solr Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": true, "secret": false, "description": "To use an existing configured solr client, instead of creating a client per endpoint. This allows customizing the client with specific advanced settings." }, "enableSSL": { "index": 8, "kind": "property", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable SSL" }, "password": { "index": 9, "kind": "property", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Password for authenticating" }, - "username": { "index": 10, "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Basic authenticate user" } + "sslContextParameters": { "index": 10, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters. When configured, this takes precedence over the certificatePath option." }, + "useGlobalSslContextParameters": { "index": 11, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }, + "username": { "index": 12, "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Basic authenticate user" } }, "headers": { "CamelSolrOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_OPERATION" }, @@ -66,6 +68,7 @@ "certificatePath": { "index": 15, "kind": "parameter", "displayName": "Certificate Path", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The certificate that can be used to access the [...] "enableSSL": { "index": 16, "kind": "parameter", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Enable SSL" }, "password": { "index": 17, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Password for authenticating" }, - "username": { "index": 18, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Basic authenticate user" } + "sslContextParameters": { "index": 18, "kind": "parameter", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "To configure security using SSLContextParameters. When [...] + "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Basic authenticate user" } } } diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java index 54c32b57f062..2a8b72a9331c 100644 --- a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java +++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java @@ -40,6 +40,10 @@ public class SolrComponentConfigurer extends PropertyConfigurerSupport implement case "requestTimeout": target.setRequestTimeout(property(camelContext, long.class, value)); return true; case "solrclient": case "solrClient": target.setSolrClient(property(camelContext, org.apache.solr.client.solrj.SolrClient.class, value)); return true; + case "sslcontextparameters": + case "sslContextParameters": target.setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; + case "useglobalsslcontextparameters": + case "useGlobalSslContextParameters": target.setUseGlobalSslContextParameters(property(camelContext, boolean.class, value)); return true; case "username": target.setUsername(property(camelContext, java.lang.String.class, value)); return true; default: return false; } @@ -70,6 +74,10 @@ public class SolrComponentConfigurer extends PropertyConfigurerSupport implement case "requestTimeout": return long.class; case "solrclient": case "solrClient": return org.apache.solr.client.solrj.SolrClient.class; + case "sslcontextparameters": + case "sslContextParameters": return org.apache.camel.support.jsse.SSLContextParameters.class; + case "useglobalsslcontextparameters": + case "useGlobalSslContextParameters": return boolean.class; case "username": return java.lang.String.class; default: return null; } @@ -96,6 +104,10 @@ public class SolrComponentConfigurer extends PropertyConfigurerSupport implement case "requestTimeout": return target.getRequestTimeout(); case "solrclient": case "solrClient": return target.getSolrClient(); + case "sslcontextparameters": + case "sslContextParameters": return target.getSslContextParameters(); + case "useglobalsslcontextparameters": + case "useGlobalSslContextParameters": return target.isUseGlobalSslContextParameters(); case "username": return target.getUsername(); default: return null; } diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java index 2226a1be21cb..86d9b996cb4e 100644 --- a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java +++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java @@ -47,6 +47,8 @@ public class SolrEndpointConfigurer extends PropertyConfigurerSupport implements case "size": target.getConfiguration().setSize(property(camelContext, java.lang.Integer.class, value)); return true; case "solrclient": case "solrClient": target.getConfiguration().setSolrClient(property(camelContext, org.apache.solr.client.solrj.SolrClient.class, value)); return true; + case "sslcontextparameters": + case "sslContextParameters": target.getConfiguration().setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; case "username": target.getConfiguration().setUsername(property(camelContext, java.lang.String.class, value)); return true; default: return false; } @@ -79,6 +81,8 @@ public class SolrEndpointConfigurer extends PropertyConfigurerSupport implements case "size": return java.lang.Integer.class; case "solrclient": case "solrClient": return org.apache.solr.client.solrj.SolrClient.class; + case "sslcontextparameters": + case "sslContextParameters": return org.apache.camel.support.jsse.SSLContextParameters.class; case "username": return java.lang.String.class; default: return null; } @@ -112,6 +116,8 @@ public class SolrEndpointConfigurer extends PropertyConfigurerSupport implements case "size": return target.getConfiguration().getSize(); case "solrclient": case "solrClient": return target.getConfiguration().getSolrClient(); + case "sslcontextparameters": + case "sslContextParameters": return target.getConfiguration().getSslContextParameters(); case "username": return target.getConfiguration().getUsername(); default: return null; } diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java index df5b1f565922..661e82dff6eb 100644 --- a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java +++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java @@ -24,7 +24,7 @@ public class SolrEndpointUriFactory extends org.apache.camel.support.component.E private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES; private static final Map<String, String> MULTI_VALUE_PREFIXES; static { - Set<String> props = new HashSet<>(19); + Set<String> props = new HashSet<>(20); props.add("async"); props.add("autoCommit"); props.add("basePath"); @@ -43,6 +43,7 @@ public class SolrEndpointUriFactory extends org.apache.camel.support.component.E props.add("requestTimeout"); props.add("size"); props.add("solrClient"); + props.add("sslContextParameters"); props.add("username"); PROPERTY_NAMES = Collections.unmodifiableSet(props); Set<String> secretProps = new HashSet<>(2); diff --git a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json b/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json index 0d901e133223..623455d38f80 100644 --- a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json +++ b/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json @@ -34,7 +34,9 @@ "solrClient": { "index": 7, "kind": "property", "displayName": "Solr Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": true, "secret": false, "description": "To use an existing configured solr client, instead of creating a client per endpoint. This allows customizing the client with specific advanced settings." }, "enableSSL": { "index": 8, "kind": "property", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable SSL" }, "password": { "index": 9, "kind": "property", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Password for authenticating" }, - "username": { "index": 10, "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Basic authenticate user" } + "sslContextParameters": { "index": 10, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters. When configured, this takes precedence over the certificatePath option." }, + "useGlobalSslContextParameters": { "index": 11, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }, + "username": { "index": 12, "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Basic authenticate user" } }, "headers": { "CamelSolrOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_OPERATION" }, @@ -66,6 +68,7 @@ "certificatePath": { "index": 15, "kind": "parameter", "displayName": "Certificate Path", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The certificate that can be used to access the [...] "enableSSL": { "index": 16, "kind": "parameter", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Enable SSL" }, "password": { "index": 17, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Password for authenticating" }, - "username": { "index": 18, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Basic authenticate user" } + "sslContextParameters": { "index": 18, "kind": "parameter", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "To configure security using SSLContextParameters. When [...] + "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Basic authenticate user" } } } diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java index 027a91cf7674..4723dcc52e95 100644 --- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java +++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java @@ -20,16 +20,18 @@ import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; +import org.apache.camel.SSLContextParametersAware; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.annotations.Component; import org.apache.camel.support.DefaultComponent; +import org.apache.camel.support.jsse.SSLContextParameters; import org.apache.solr.client.solrj.SolrClient; /** * Represents the component that manages {@link SolrEndpoint}. */ @Component("solr") -public class SolrComponent extends DefaultComponent { +public class SolrComponent extends DefaultComponent implements SSLContextParametersAware { @Metadata(label = "advanced", autowired = true) private SolrClient solrClient; @@ -49,6 +51,10 @@ public class SolrComponent extends DefaultComponent { private String password; @Metadata(label = "security") private boolean enableSSL; + @Metadata(label = "security") + private SSLContextParameters sslContextParameters; + @Metadata(label = "security", defaultValue = "false") + private boolean useGlobalSslContextParameters; public SolrComponent() { this(null); @@ -70,11 +76,16 @@ public class SolrComponent extends DefaultComponent { config.setEnableSSL(this.isEnableSSL()); config.setUsername(this.getUsername()); config.setPassword(this.getPassword()); + config.setSslContextParameters(this.getSslContextParameters()); config.configure(uri); Endpoint endpoint = new SolrEndpoint(uri, this, config); setProperties(endpoint, parameters); + if (config.getSslContextParameters() == null) { + config.setSslContextParameters(retrieveGlobalSslContextParameters()); + } + // add collection from solrclient if it is not yet defined // while it might be set on the solr client that could be set from parameters if (config.getCollection() == null && config.getSolrClient() != null) { @@ -184,4 +195,29 @@ public class SolrComponent extends DefaultComponent { this.enableSSL = enableSSL; } + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + /** + * To configure security using SSLContextParameters. When configured, this takes precedence over the + * {@code certificatePath} option. + */ + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } + + @Override + public boolean isUseGlobalSslContextParameters() { + return useGlobalSslContextParameters; + } + + /** + * Enable usage of global SSL context parameters. + */ + @Override + public void setUseGlobalSslContextParameters(boolean useGlobalSslContextParameters) { + this.useGlobalSslContextParameters = useGlobalSslContextParameters; + } + } diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java index 5c278f416fc6..ce57eb2360d9 100644 --- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java +++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java @@ -24,6 +24,7 @@ import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriParams; import org.apache.camel.spi.UriPath; +import org.apache.camel.support.jsse.SSLContextParameters; import org.apache.camel.util.ObjectHelper; import org.apache.solr.client.solrj.SolrClient; @@ -60,6 +61,8 @@ public class SolrConfiguration { @UriParam(label = "security") @Metadata(supportFileReference = true) private String certificatePath; + @UriParam(label = "security") + private SSLContextParameters sslContextParameters; @UriParam private Long requestTimeout; @UriParam @@ -311,6 +314,19 @@ public class SolrConfiguration { this.certificatePath = certificatePath; } + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + /** + * To configure security using SSLContextParameters. When configured, this takes precedence over the + * {@code certificatePath} option. This allows configuring named groups, signature schemes, cipher suites, and + * protocols for the TLS connection. + */ + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } + /** * The time in ms to wait before connection will time out. */ diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java index 2ff1e0ec4376..f5f2fd66dd88 100644 --- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java +++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java @@ -35,6 +35,7 @@ import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; import org.apache.camel.support.DefaultEndpoint; import org.apache.camel.support.ResourceHelper; +import org.apache.camel.support.jsse.SSLContextParameters; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.URISupport; @@ -136,7 +137,9 @@ public class SolrEndpoint extends DefaultEndpoint implements EndpointServiceLoca if (ObjectHelper.isNotEmpty(configuration.getUsername()) && ObjectHelper.isNotEmpty(configuration.getPassword())) { builder.withBasicAuthCredentials(configuration.getUsername(), configuration.getPassword()); } - if (ObjectHelper.isNotEmpty(configuration.getCertificatePath())) { + if (configuration.getSslContextParameters() != null) { + builder.withSSLContext(createSslContext(getCamelContext(), configuration.getSslContextParameters())); + } else if (ObjectHelper.isNotEmpty(configuration.getCertificatePath())) { builder.withSSLContext(createSslContextFromCa(getCamelContext(), configuration.getCertificatePath())); } if (configuration.getCollection() != null) { @@ -152,6 +155,21 @@ public class SolrEndpoint extends DefaultEndpoint implements EndpointServiceLoca return configuration.isAsync(); } + /** + * An SSL context based on the provided {@link SSLContextParameters}. Using SSLContextParameters allows fine-grained + * TLS configuration such as named groups, signature schemes, cipher suites and protocols (e.g. for post-quantum + * readiness on JDK 25+). + * + * @return a customized SSL Context + */ + private static SSLContext createSslContext(CamelContext camelContext, SSLContextParameters sslContextParameters) { + try { + return sslContextParameters.createSSLContext(camelContext); + } catch (Exception e) { + throw new RuntimeException("Failed to create SSLContext from SSLContextParameters", e); + } + } + /** * An SSL context based on the self-signed CA, so that using this SSL Context allows to connect to the solr instance * diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrSslContextParametersTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrSslContextParametersTest.java new file mode 100644 index 000000000000..a4c65e8259ba --- /dev/null +++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrSslContextParametersTest.java @@ -0,0 +1,121 @@ +/* + * 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.solr; + +import org.apache.camel.CamelContext; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.support.jsse.SSLContextParameters; +import org.apache.solr.client.solrj.SolrClient; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SolrSslContextParametersTest { + + private static final String SOLR_URI = "solr://localhost:8983"; + + @Test + public void configurationPropertyRoundTrip() { + SolrConfiguration configuration = new SolrConfiguration(); + assertNull(configuration.getSslContextParameters(), + "SSLContextParameters should be null by default"); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + configuration.setSslContextParameters(sslContextParameters); + assertSame(sslContextParameters, configuration.getSslContextParameters(), + "Getter should return the value set via setter"); + } + + @Test + public void componentPropagatesSslContextParametersToEndpoint() throws Exception { + try (CamelContext context = new DefaultCamelContext()) { + context.start(); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + SolrComponent component = new SolrComponent(context); + component.setSslContextParameters(sslContextParameters); + context.addComponent("solr", component); + + SolrEndpoint endpoint = context.getEndpoint(SOLR_URI, SolrEndpoint.class); + assertNotNull(endpoint); + assertSame(sslContextParameters, endpoint.getConfiguration().getSslContextParameters(), + "Component-level SSLContextParameters must propagate to the endpoint configuration"); + } + } + + @Test + public void endpointUsesGlobalSslContextParametersWhenEnabled() throws Exception { + try (CamelContext context = new DefaultCamelContext()) { + SSLContextParameters globalParameters = new SSLContextParameters(); + context.setSSLContextParameters(globalParameters); + context.start(); + + SolrComponent component = new SolrComponent(context); + component.setUseGlobalSslContextParameters(true); + context.addComponent("solr", component); + + SolrEndpoint endpoint = context.getEndpoint(SOLR_URI, SolrEndpoint.class); + assertNotNull(endpoint); + assertTrue(component.isUseGlobalSslContextParameters()); + assertSame(globalParameters, endpoint.getConfiguration().getSslContextParameters(), + "Global SSLContextParameters must be used when useGlobalSslContextParameters is true"); + } + } + + @Test + public void explicitSslContextParametersWinOverGlobal() throws Exception { + try (CamelContext context = new DefaultCamelContext()) { + SSLContextParameters globalParameters = new SSLContextParameters(); + context.setSSLContextParameters(globalParameters); + context.start(); + + SSLContextParameters explicitParameters = new SSLContextParameters(); + SolrComponent component = new SolrComponent(context); + component.setUseGlobalSslContextParameters(true); + component.setSslContextParameters(explicitParameters); + context.addComponent("solr", component); + + SolrEndpoint endpoint = context.getEndpoint(SOLR_URI, SolrEndpoint.class); + assertNotNull(endpoint); + assertSame(explicitParameters, endpoint.getConfiguration().getSslContextParameters(), + "Component-level SSLContextParameters must win over the global one"); + } + } + + @Test + public void createSolrClientAppliesSslContextParameters() throws Exception { + try (CamelContext context = new DefaultCamelContext()) { + context.start(); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + SolrComponent component = new SolrComponent(context); + component.setSslContextParameters(sslContextParameters); + context.addComponent("solr", component); + + SolrEndpoint endpoint = context.getEndpoint(SOLR_URI, SolrEndpoint.class); + assertSame(sslContextParameters, endpoint.getConfiguration().getSslContextParameters()); + + // building the client must succeed with the SSLContext derived from SSLContextParameters + try (SolrClient client = endpoint.createSolrClient()) { + assertNotNull(client, "SolrClient should be built using the configured SSLContextParameters"); + } + } + } +} diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrComponentBuilderFactory.java index 94ef2e2bef5e..2c71f0638b62 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrComponentBuilderFactory.java @@ -227,6 +227,40 @@ public interface SolrComponentBuilderFactory { return this; } + /** + * To configure security using SSLContextParameters. When configured, + * this takes precedence over the certificatePath option. + * + * The option is a: + * <code>org.apache.camel.support.jsse.SSLContextParameters</code> type. + * + * Group: security + * + * @param sslContextParameters the value to set + * @return the dsl builder + */ + default SolrComponentBuilder sslContextParameters(org.apache.camel.support.jsse.SSLContextParameters sslContextParameters) { + doSetProperty("sslContextParameters", sslContextParameters); + return this; + } + + + /** + * Enable usage of global SSL context parameters. + * + * The option is a: <code>boolean</code> type. + * + * Default: false + * Group: security + * + * @param useGlobalSslContextParameters the value to set + * @return the dsl builder + */ + default SolrComponentBuilder useGlobalSslContextParameters(boolean useGlobalSslContextParameters) { + doSetProperty("useGlobalSslContextParameters", useGlobalSslContextParameters); + return this; + } + /** * Basic authenticate user. * @@ -266,6 +300,8 @@ public interface SolrComponentBuilderFactory { case "solrClient": ((SolrComponent) component).setSolrClient((org.apache.solr.client.solrj.SolrClient) value); return true; case "enableSSL": ((SolrComponent) component).setEnableSSL((boolean) value); return true; case "password": ((SolrComponent) component).setPassword((java.lang.String) value); return true; + case "sslContextParameters": ((SolrComponent) component).setSslContextParameters((org.apache.camel.support.jsse.SSLContextParameters) value); return true; + case "useGlobalSslContextParameters": ((SolrComponent) component).setUseGlobalSslContextParameters((boolean) value); return true; case "username": ((SolrComponent) component).setUsername((java.lang.String) value); return true; default: return false; } diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java index 1dc5fac39fe1..1cafa420cff6 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java @@ -376,6 +376,42 @@ public interface SolrEndpointBuilderFactory { doSetProperty("password", password); return this; } + /** + * To configure security using SSLContextParameters. When configured, + * this takes precedence over the certificatePath option. This allows + * configuring named groups, signature schemes, cipher suites, and + * protocols for the TLS connection. + * + * The option is a: + * <code>org.apache.camel.support.jsse.SSLContextParameters</code> type. + * + * Group: security + * + * @param sslContextParameters the value to set + * @return the dsl builder + */ + default SolrEndpointBuilder sslContextParameters(org.apache.camel.support.jsse.SSLContextParameters sslContextParameters) { + doSetProperty("sslContextParameters", sslContextParameters); + return this; + } + /** + * To configure security using SSLContextParameters. When configured, + * this takes precedence over the certificatePath option. This allows + * configuring named groups, signature schemes, cipher suites, and + * protocols for the TLS connection. + * + * The option will be converted to a + * <code>org.apache.camel.support.jsse.SSLContextParameters</code> type. + * + * Group: security + * + * @param sslContextParameters the value to set + * @return the dsl builder + */ + default SolrEndpointBuilder sslContextParameters(String sslContextParameters) { + doSetProperty("sslContextParameters", sslContextParameters); + return this; + } /** * Basic authenticate user. *
