This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 5f9778012015 CAMEL-23446: camel-solr - Add SSLContextParameters
support for TLS configuration (#23939)
5f9778012015 is described below
commit 5f977801201519350432497e92a9f7586776174c
Author: Andrea Cosentino <[email protected]>
AuthorDate: Thu Jun 11 14:12:25 2026 +0200
CAMEL-23446: camel-solr - Add SSLContextParameters support for TLS
configuration (#23939)
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.
*