You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2026/06/11 09:15:13 UTC
(camel) branch fix/CAMEL-23446 created (now f3842d149eb9)
This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a change to branch fix/CAMEL-23446
in repository https://gitbox.apache.org/repos/asf/camel.git
at f3842d149eb9 CAMEL-23446: camel-solr - Add SSLContextParameters support for TLS configuration
This branch includes the following new commits:
new f3842d149eb9 CAMEL-23446: camel-solr - Add SSLContextParameters support for TLS configuration
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(camel) 01/01: CAMEL-23446: camel-solr - Add SSLContextParameters support for TLS configuration
Posted by ac...@apache.org.
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 <an...@gmail.com>
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) <no...@anthropic.com>
Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
.../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.
*