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 e1854b4ef92a CAMEL-23445: camel-elasticsearch-rest-client - Add 
SSLContextParameters support for TLS configuration (#23967)
e1854b4ef92a is described below

commit e1854b4ef92aa8fe6c53d41ddf2f510c114ba11d
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Jun 12 10:23:38 2026 +0200

    CAMEL-23445: camel-elasticsearch-rest-client - Add SSLContextParameters 
support for TLS configuration (#23967)
    
    Add SSLContextParameters support to camel-elasticsearch-rest-client 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+. ElasticsearchRestClientComponent now implements 
SSLContextParametersAware
    with a global SSLContextParameters fallback, and 
ElasticsearchRestClientProducer
    builds the SSLContext from SSLContextParameters when configured, keeping the
    existing certificatePath (CA-only) path as a fallback. The HTTP client 
config
    callback is now applied independently of basic-auth credentials, so TLS is 
honored
    even when no user/password is set. Mirrors CAMEL-23314 (camel-opensearch) 
and
    CAMEL-23444 (camel-elasticsearch), and adds an upgrade-guide entry covering 
the
    SSLContextParameters additions across the search components.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../components/elasticsearch-rest-client.json      |   7 +-
 ...ElasticsearchRestClientComponentConfigurer.java |  12 +++
 .../ElasticsearchRestClientEndpointConfigurer.java |   6 ++
 .../ElasticsearchRestClientEndpointUriFactory.java |   3 +-
 .../rest/client/elasticsearch-rest-client.json     |   7 +-
 .../client/ElasticsearchRestClientComponent.java   |  37 +++++++-
 .../client/ElasticsearchRestClientEndpoint.java    |  16 ++++
 .../client/ElasticsearchRestClientProducer.java    |  29 ++++--
 ...icsearchRestClientSslContextParametersTest.java | 103 +++++++++++++++++++++
 .../ROOT/pages/camel-4x-upgrade-guide-4_21.adoc    |  16 ++++
 ...ticsearchRestClientComponentBuilderFactory.java |  36 +++++++
 ...sticsearchRestClientEndpointBuilderFactory.java |  36 +++++++
 12 files changed, 292 insertions(+), 16 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/elasticsearch-rest-client.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/elasticsearch-rest-client.json
index b084c0611806..336dd3ab86a3 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/elasticsearch-rest-client.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/elasticsearch-rest-client.json
@@ -35,7 +35,9 @@
     "snifferInterval": { "index": 8, "kind": "property", "displayName": 
"Sniffer Interval", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 60000, "description": "Sniffer interval 
(in millis)" },
     "certificatePath": { "index": 9, "kind": "property", "displayName": 
"Certificate Path", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "supportFileReference": true, 
"description": "Certificate Path" },
     "password": { "index": 10, "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" },
-    "user": { "index": 11, "kind": "property", "displayName": "User", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
+    "sslContextParameters": { "index": 11, "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": 12, "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." },
+    "user": { "index": 13, "kind": "property", "displayName": "User", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
   },
   "headers": {
     "CamelElasticsearchId": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "ID of the object to index or retrieve or delete", 
"constantName": 
"org.apache.camel.component.elasticsearch.rest.client.ElasticSearchRestClientConstant#ID"
 },
@@ -58,6 +60,7 @@
     "snifferInterval": { "index": 10, "kind": "parameter", "displayName": 
"Sniffer Interval", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 60000, "description": "Sniffer interval 
(in millis)" },
     "certificatePath": { "index": 11, "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, "description": "Certificate Path" },
     "password": { "index": 12, "kind": "parameter", "displayName": "Password", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Password" },
-    "user": { "index": 13, "kind": "parameter", "displayName": "User", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
+    "sslContextParameters": { "index": 13, "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, "description": "To configure security 
using SSLContextParameters. When configured, this takes precedence over the 
certificatePath option. This allows configuring named groups, signatur [...]
+    "user": { "index": 14, "kind": "parameter", "displayName": "User", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
   }
 }
diff --git 
a/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponentConfigurer.java
 
b/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponentConfigurer.java
index 0db4ab9e77c3..aada3cce9a8c 100644
--- 
a/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponentConfigurer.java
+++ 
b/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponentConfigurer.java
@@ -44,6 +44,10 @@ public class ElasticsearchRestClientComponentConfigurer 
extends PropertyConfigur
         case "snifferInterval": 
target.setSnifferInterval(property(camelContext, int.class, value)); return 
true;
         case "sockettimeout":
         case "socketTimeout": target.setSocketTimeout(property(camelContext, 
int.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 "user": target.setUser(property(camelContext, 
java.lang.String.class, value)); return true;
         default: return false;
         }
@@ -78,6 +82,10 @@ public class ElasticsearchRestClientComponentConfigurer 
extends PropertyConfigur
         case "snifferInterval": return int.class;
         case "sockettimeout":
         case "socketTimeout": return int.class;
+        case "sslcontextparameters":
+        case "sslContextParameters": return 
org.apache.camel.support.jsse.SSLContextParameters.class;
+        case "useglobalsslcontextparameters":
+        case "useGlobalSslContextParameters": return boolean.class;
         case "user": return java.lang.String.class;
         default: return null;
         }
@@ -108,6 +116,10 @@ public class ElasticsearchRestClientComponentConfigurer 
extends PropertyConfigur
         case "snifferInterval": return target.getSnifferInterval();
         case "sockettimeout":
         case "socketTimeout": return target.getSocketTimeout();
+        case "sslcontextparameters":
+        case "sslContextParameters": return target.getSslContextParameters();
+        case "useglobalsslcontextparameters":
+        case "useGlobalSslContextParameters": return 
target.isUseGlobalSslContextParameters();
         case "user": return target.getUser();
         default: return null;
         }
diff --git 
a/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointConfigurer.java
 
b/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointConfigurer.java
index c6e86ff89615..fb91f0f272a1 100644
--- 
a/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointConfigurer.java
+++ 
b/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointConfigurer.java
@@ -45,6 +45,8 @@ public class ElasticsearchRestClientEndpointConfigurer 
extends PropertyConfigure
         case "snifferInterval": 
target.setSnifferInterval(property(camelContext, int.class, value)); return 
true;
         case "sockettimeout":
         case "socketTimeout": target.setSocketTimeout(property(camelContext, 
int.class, value)); return true;
+        case "sslcontextparameters":
+        case "sslContextParameters": 
target.setSslContextParameters(property(camelContext, 
org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true;
         case "user": target.setUser(property(camelContext, 
java.lang.String.class, value)); return true;
         default: return false;
         }
@@ -80,6 +82,8 @@ public class ElasticsearchRestClientEndpointConfigurer 
extends PropertyConfigure
         case "snifferInterval": return int.class;
         case "sockettimeout":
         case "socketTimeout": return int.class;
+        case "sslcontextparameters":
+        case "sslContextParameters": return 
org.apache.camel.support.jsse.SSLContextParameters.class;
         case "user": return java.lang.String.class;
         default: return null;
         }
@@ -111,6 +115,8 @@ public class ElasticsearchRestClientEndpointConfigurer 
extends PropertyConfigure
         case "snifferInterval": return target.getSnifferInterval();
         case "sockettimeout":
         case "socketTimeout": return target.getSocketTimeout();
+        case "sslcontextparameters":
+        case "sslContextParameters": return target.getSslContextParameters();
         case "user": return target.getUser();
         default: return null;
         }
diff --git 
a/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointUriFactory.java
 
b/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointUriFactory.java
index 3c3f31c0b24b..88f34e6aea01 100644
--- 
a/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointUriFactory.java
+++ 
b/components/camel-elasticsearch-rest-client/src/generated/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpointUriFactory.java
@@ -24,7 +24,7 @@ public class ElasticsearchRestClientEndpointUriFactory 
extends org.apache.camel.
     private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(14);
+        Set<String> props = new HashSet<>(15);
         props.add("certificatePath");
         props.add("clusterName");
         props.add("connectionTimeout");
@@ -38,6 +38,7 @@ public class ElasticsearchRestClientEndpointUriFactory 
extends org.apache.camel.
         props.add("sniffAfterFailureDelay");
         props.add("snifferInterval");
         props.add("socketTimeout");
+        props.add("sslContextParameters");
         props.add("user");
         PROPERTY_NAMES = Collections.unmodifiableSet(props);
         Set<String> secretProps = new HashSet<>(2);
diff --git 
a/components/camel-elasticsearch-rest-client/src/generated/resources/META-INF/org/apache/camel/component/elasticsearch/rest/client/elasticsearch-rest-client.json
 
b/components/camel-elasticsearch-rest-client/src/generated/resources/META-INF/org/apache/camel/component/elasticsearch/rest/client/elasticsearch-rest-client.json
index b084c0611806..336dd3ab86a3 100644
--- 
a/components/camel-elasticsearch-rest-client/src/generated/resources/META-INF/org/apache/camel/component/elasticsearch/rest/client/elasticsearch-rest-client.json
+++ 
b/components/camel-elasticsearch-rest-client/src/generated/resources/META-INF/org/apache/camel/component/elasticsearch/rest/client/elasticsearch-rest-client.json
@@ -35,7 +35,9 @@
     "snifferInterval": { "index": 8, "kind": "property", "displayName": 
"Sniffer Interval", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 60000, "description": "Sniffer interval 
(in millis)" },
     "certificatePath": { "index": 9, "kind": "property", "displayName": 
"Certificate Path", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "supportFileReference": true, 
"description": "Certificate Path" },
     "password": { "index": 10, "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" },
-    "user": { "index": 11, "kind": "property", "displayName": "User", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
+    "sslContextParameters": { "index": 11, "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": 12, "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." },
+    "user": { "index": 13, "kind": "property", "displayName": "User", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
   },
   "headers": {
     "CamelElasticsearchId": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "ID of the object to index or retrieve or delete", 
"constantName": 
"org.apache.camel.component.elasticsearch.rest.client.ElasticSearchRestClientConstant#ID"
 },
@@ -58,6 +60,7 @@
     "snifferInterval": { "index": 10, "kind": "parameter", "displayName": 
"Sniffer Interval", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 60000, "description": "Sniffer interval 
(in millis)" },
     "certificatePath": { "index": 11, "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, "description": "Certificate Path" },
     "password": { "index": 12, "kind": "parameter", "displayName": "Password", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Password" },
-    "user": { "index": 13, "kind": "parameter", "displayName": "User", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
+    "sslContextParameters": { "index": 13, "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, "description": "To configure security 
using SSLContextParameters. When configured, this takes precedence over the 
certificatePath option. This allows configuring named groups, signatur [...]
+    "user": { "index": 14, "kind": "parameter", "displayName": "User", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "Username" }
   }
 }
diff --git 
a/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponent.java
 
b/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponent.java
index 2c47e6e1a80a..b7b3927b6bd9 100644
--- 
a/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponent.java
+++ 
b/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientComponent.java
@@ -19,13 +19,15 @@ package 
org.apache.camel.component.elasticsearch.rest.client;
 import java.util.Map;
 
 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.elasticsearch.client.RestClient;
 
 @Component("elasticsearch-rest-client")
-public class ElasticsearchRestClientComponent extends DefaultComponent {
+public class ElasticsearchRestClientComponent extends DefaultComponent 
implements SSLContextParametersAware {
 
     @Metadata(label = "advanced", autowired = true)
     RestClient restClient;
@@ -41,6 +43,10 @@ public class ElasticsearchRestClientComponent extends 
DefaultComponent {
     private String password;
     @Metadata(label = "security", supportFileReference = true)
     private String certificatePath;
+    @Metadata(label = "security")
+    private SSLContextParameters sslContextParameters;
+    @Metadata(label = "security", defaultValue = "false")
+    private boolean useGlobalSslContextParameters;
     @Metadata(label = "advanced")
     private boolean enableSniffer;
     @Metadata(label = "advanced", defaultValue = "" + 
ElasticSearchRestClientConstant.SNIFFER_INTERVAL_AND_FAILURE_DELAY)
@@ -61,10 +67,14 @@ public class ElasticsearchRestClientComponent extends 
DefaultComponent {
         endpoint.setUser(user);
         endpoint.setPassword(password);
         endpoint.setCertificatePath(certificatePath);
+        endpoint.setSslContextParameters(sslContextParameters);
         endpoint.setEnableSniffer(enableSniffer);
         endpoint.setSnifferInterval(snifferInterval);
         endpoint.setSniffAfterFailureDelay(sniffAfterFailureDelay);
         setProperties(endpoint, parameters);
+        if (endpoint.getSslContextParameters() == null) {
+            
endpoint.setSslContextParameters(retrieveGlobalSslContextParameters());
+        }
         return endpoint;
     }
 
@@ -177,4 +187,29 @@ public class ElasticsearchRestClientComponent extends 
DefaultComponent {
     public void setSniffAfterFailureDelay(int sniffAfterFailureDelay) {
         this.sniffAfterFailureDelay = sniffAfterFailureDelay;
     }
+
+    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-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpoint.java
 
b/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpoint.java
index 0ed090ee1a8e..b0a1dcef4413 100644
--- 
a/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpoint.java
+++ 
b/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientEndpoint.java
@@ -26,6 +26,7 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.jsse.SSLContextParameters;
 import org.elasticsearch.client.RestClient;
 
 /**
@@ -64,6 +65,8 @@ public class ElasticsearchRestClientEndpoint extends 
DefaultEndpoint implements
     @UriParam(label = "security")
     @Metadata(supportFileReference = true)
     private String certificatePath;
+    @UriParam(label = "security")
+    private SSLContextParameters sslContextParameters;
 
     @UriParam(label = "advanced")
     private boolean enableSniffer;
@@ -209,6 +212,19 @@ public class ElasticsearchRestClientEndpoint extends 
DefaultEndpoint implements
         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;
+    }
+
     /**
      * Enabling Sniffer
      */
diff --git 
a/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientProducer.java
 
b/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientProducer.java
index dc9b82ee34b2..68aeea3cd4cb 100644
--- 
a/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientProducer.java
+++ 
b/components/camel-elasticsearch-rest-client/src/main/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientProducer.java
@@ -380,18 +380,27 @@ public class ElasticsearchRestClientProducer extends 
DefaultAsyncProducer {
         builder.setRequestConfigCallback(requestConfigBuilder -> 
requestConfigBuilder
                 
.setConnectTimeout(this.endpoint.getConnectionTimeout()).setSocketTimeout(this.endpoint.getSocketTimeout()));
 
-        if (this.endpoint.getUser() != null && this.endpoint.getPassword() != 
null) {
-            final CredentialsProvider credentialsProvider = new 
BasicCredentialsProvider();
-            credentialsProvider.setCredentials(AuthScope.ANY,
-                    new UsernamePasswordCredentials(this.endpoint.getUser(), 
this.endpoint.getPassword()));
-            builder.setHttpClientConfigCallback(httpClientBuilder -> {
+        builder.setHttpClientConfigCallback(httpClientBuilder -> {
+            if (this.endpoint.getUser() != null && this.endpoint.getPassword() 
!= null) {
+                final CredentialsProvider credentialsProvider = new 
BasicCredentialsProvider();
+                credentialsProvider.setCredentials(AuthScope.ANY,
+                        new 
UsernamePasswordCredentials(this.endpoint.getUser(), 
this.endpoint.getPassword()));
                 
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
-                if (this.endpoint.getCertificatePath() != null) {
-                    httpClientBuilder.setSSLContext(createSslContextFromCa());
+            }
+            if (this.endpoint.getSslContextParameters() != null) {
+                // Use SSLContextParameters (allows configuring named groups, 
signature schemes, cipher suites and
+                // protocols), e.g. for post-quantum readiness on JDK 25+
+                try {
+                    httpClientBuilder.setSSLContext(
+                            
this.endpoint.getSslContextParameters().createSSLContext(getEndpoint().getCamelContext()));
+                } catch (Exception e) {
+                    throw new RuntimeException("Failed to create SSLContext 
from SSLContextParameters", e);
                 }
-                return httpClientBuilder;
-            });
-        }
+            } else if (this.endpoint.getCertificatePath() != null) {
+                httpClientBuilder.setSSLContext(createSslContextFromCa());
+            }
+            return httpClientBuilder;
+        });
         final RestClient restClient = builder.build();
 
         // initiate Sniffer
diff --git 
a/components/camel-elasticsearch-rest-client/src/test/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientSslContextParametersTest.java
 
b/components/camel-elasticsearch-rest-client/src/test/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientSslContextParametersTest.java
new file mode 100644
index 000000000000..de66ead9df73
--- /dev/null
+++ 
b/components/camel-elasticsearch-rest-client/src/test/java/org/apache/camel/component/elasticsearch/rest/client/ElasticsearchRestClientSslContextParametersTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.elasticsearch.rest.client;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.support.jsse.SSLContextParameters;
+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 ElasticsearchRestClientSslContextParametersTest {
+
+    private static final String URI = "elasticsearch-rest-client:test-cluster";
+
+    @Test
+    public void componentPropertyRoundTrip() {
+        ElasticsearchRestClientComponent component = new 
ElasticsearchRestClientComponent();
+        assertNull(component.getSslContextParameters(),
+                "SSLContextParameters should be null by default");
+
+        SSLContextParameters sslContextParameters = new SSLContextParameters();
+        component.setSslContextParameters(sslContextParameters);
+        assertSame(sslContextParameters, component.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();
+            ElasticsearchRestClientComponent component = new 
ElasticsearchRestClientComponent();
+            component.setHostAddressesList("localhost:9200");
+            component.setSslContextParameters(sslContextParameters);
+            context.addComponent("elasticsearch-rest-client", component);
+
+            ElasticsearchRestClientEndpoint endpoint = 
context.getEndpoint(URI, ElasticsearchRestClientEndpoint.class);
+            assertNotNull(endpoint);
+            assertSame(sslContextParameters, 
endpoint.getSslContextParameters(),
+                    "Component-level SSLContextParameters must propagate to 
the endpoint");
+        }
+    }
+
+    @Test
+    public void endpointUsesGlobalSslContextParametersWhenEnabled() throws 
Exception {
+        try (CamelContext context = new DefaultCamelContext()) {
+            SSLContextParameters globalParameters = new SSLContextParameters();
+            context.setSSLContextParameters(globalParameters);
+            context.start();
+
+            ElasticsearchRestClientComponent component = new 
ElasticsearchRestClientComponent();
+            component.setHostAddressesList("localhost:9200");
+            component.setUseGlobalSslContextParameters(true);
+            context.addComponent("elasticsearch-rest-client", component);
+
+            ElasticsearchRestClientEndpoint endpoint = 
context.getEndpoint(URI, ElasticsearchRestClientEndpoint.class);
+            assertNotNull(endpoint);
+            assertTrue(component.isUseGlobalSslContextParameters());
+            assertSame(globalParameters, endpoint.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();
+            ElasticsearchRestClientComponent component = new 
ElasticsearchRestClientComponent();
+            component.setHostAddressesList("localhost:9200");
+            component.setUseGlobalSslContextParameters(true);
+            component.setSslContextParameters(explicitParameters);
+            context.addComponent("elasticsearch-rest-client", component);
+
+            ElasticsearchRestClientEndpoint endpoint = 
context.getEndpoint(URI, ElasticsearchRestClientEndpoint.class);
+            assertNotNull(endpoint);
+            assertSame(explicitParameters, endpoint.getSslContextParameters(),
+                    "Component-level SSLContextParameters must win over the 
global one");
+        }
+    }
+}
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
index 60ba22b5cf99..7e66b555bda4 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
@@ -467,6 +467,22 @@ Routes that attach a `KeycloakSecurityPolicy` without any 
roles or permissions a
 unverified or invalid token will now have such requests rejected with a 
`CamelAuthorizationException`. Provide a
 valid, verifiable token (or configure `requiredRoles` / `requiredPermissions`) 
for these routes.
 
+=== camel-elasticsearch / camel-elasticsearch-rest-client / camel-solr
+
+The `camel-elasticsearch`, `camel-elasticsearch-rest-client` and `camel-solr` 
components now support
+configuring TLS through `SSLContextParameters` (the JSSE utility), in addition 
to the existing
+`certificatePath` option. The new `sslContextParameters` option allows 
configuring named groups,
+signature schemes, cipher suites and protocols, for example post-quantum named 
groups such as
+`X25519MLKEM768` on JDK 25+. It can be set at the endpoint or component level, 
and the components also
+honor the context-wide global SSL configuration via 
`useGlobalSslContextParameters`. When configured,
+`SSLContextParameters` takes precedence over `certificatePath`.
+
+For `camel-elasticsearch` and `camel-elasticsearch-rest-client`, the HTTP 
client is now configured with
+the TLS settings regardless of whether basic authentication 
(`user`/`password`) is set. Previously the
+`certificatePath` option was silently ignored unless both `user` and 
`password` were configured. Routes
+that set `certificatePath` without credentials will now correctly use the 
configured TLS context where it
+was previously a no-op.
+
 === camel-stomp removal
 
 Camel stomp was deprecated with Camel 4.17. The stomp library didn't have any 
activities in the last 10 years. The component is now removed.
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/ElasticsearchRestClientComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/ElasticsearchRestClientComponentBuilderFactory.java
index 89fcef0e3771..31d7a2eb7bb0 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/ElasticsearchRestClientComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/ElasticsearchRestClientComponentBuilderFactory.java
@@ -249,6 +249,40 @@ public interface 
ElasticsearchRestClientComponentBuilderFactory {
             return this;
         }
     
+        /**
+         * To configure security using SSLContextParameters. When configured,
+         * this takes precedence over the certificatePath option.
+         * 
+         * The option is a:
+         * 
&lt;code&gt;org.apache.camel.support.jsse.SSLContextParameters&lt;/code&gt; 
type.
+         * 
+         * Group: security
+         * 
+         * @param sslContextParameters the value to set
+         * @return the dsl builder
+         */
+        default ElasticsearchRestClientComponentBuilder 
sslContextParameters(org.apache.camel.support.jsse.SSLContextParameters 
sslContextParameters) {
+            doSetProperty("sslContextParameters", sslContextParameters);
+            return this;
+        }
+    
+        
+        /**
+         * Enable usage of global SSL context parameters.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param useGlobalSslContextParameters the value to set
+         * @return the dsl builder
+         */
+        default ElasticsearchRestClientComponentBuilder 
useGlobalSslContextParameters(boolean useGlobalSslContextParameters) {
+            doSetProperty("useGlobalSslContextParameters", 
useGlobalSslContextParameters);
+            return this;
+        }
+    
         /**
          * Username.
          * 
@@ -289,6 +323,8 @@ public interface 
ElasticsearchRestClientComponentBuilderFactory {
             case "snifferInterval": ((ElasticsearchRestClientComponent) 
component).setSnifferInterval((int) value); return true;
             case "certificatePath": ((ElasticsearchRestClientComponent) 
component).setCertificatePath((java.lang.String) value); return true;
             case "password": ((ElasticsearchRestClientComponent) 
component).setPassword((java.lang.String) value); return true;
+            case "sslContextParameters": ((ElasticsearchRestClientComponent) 
component).setSslContextParameters((org.apache.camel.support.jsse.SSLContextParameters)
 value); return true;
+            case "useGlobalSslContextParameters": 
((ElasticsearchRestClientComponent) 
component).setUseGlobalSslContextParameters((boolean) value); return true;
             case "user": ((ElasticsearchRestClientComponent) 
component).setUser((java.lang.String) value); return true;
             default: return false;
             }
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/ElasticsearchRestClientEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/ElasticsearchRestClientEndpointBuilderFactory.java
index 2fb262566a8d..929b5ed59855 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/ElasticsearchRestClientEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/ElasticsearchRestClientEndpointBuilderFactory.java
@@ -194,6 +194,42 @@ public interface 
ElasticsearchRestClientEndpointBuilderFactory {
             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 ElasticsearchRestClientEndpointBuilder 
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 ElasticsearchRestClientEndpointBuilder 
sslContextParameters(String sslContextParameters) {
+            doSetProperty("sslContextParameters", sslContextParameters);
+            return this;
+        }
         /**
          * Username.
          * 


Reply via email to