Companies sometimes use self-signed certificates internally in their systems. When building a Camel-K application we need to tell Camel to trust those certificates. I’m here going to show one solution in Java for this, using a truststore.
MyHTTPClient.java
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.support.jsse.*;
public class MyHTTPClient extends RouteBuilder {
@Override
public void configure() throws Exception {
registerSslContextParameter(); // 4.
from("timer:mytimer?repeatCount=1")
.to("https://my.server.com/person?
sslContextParameters=#mySSLContextParameters") // 5.
.log("${body}");
}
private void registerSslContextParameter() throws Exception { // 1.
KeyStoreParameters tsp = new KeyStoreParameters();
tsp.setResource("/etc/ssl/truststore.jks"); // 2.
tsp.setPassword("password");
TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(tsp);
SSLContextParameters sslContextParameters = new SSLContextParameters();
sslContextParameters.setTrustManagers(tmp);
this.getContext()
.getRegistry()
.bind("mySSLContextParameters", sslContextParameters); // 3.
}
}
The important parts:
- We need a place to create our SSL context – I like to put it in a separate function
- Path to the truststore that contain the self-signed certificate
- Register our new SSL context in the Camel register
- Call our function to set the new SSL context before our Camel flow
- Now we need to tell the Camel HTTP-component to use our new SSL context via the components url parameters
Run parameters
kamel run --resource file:truststore.jks@/etc/ssl/truststore.jks MyHTTPClient.java
Lastly we need to import the truststore into the Camle-K pod. Note that we place the truststore in /etc/ssl/ which is the same as above path (bullet point 2)
Tested on Apache Camel 3.19.0, Minikube v1.29.0 in Ubuntu 20.04 and Java 1.8.0_352