rgolangh commented on code in PR #611: URL: https://github.com/apache/incubator-kie-kogito-docs/pull/611#discussion_r1549674948
########## serverlessworkflow/modules/ROOT/pages/cloud/operator/add-custom-ca-to-a-workflow-pod.adoc: ########## @@ -0,0 +1,188 @@ += Adding a custom CA Certificate to a Container Running Java +:compat-mode!: +:keywords: kogito, sonataflow, workflow, serverless, operator, kubernetes, minikube, openshift, containers +:keytool-docs: https://docs.oracle.com/en/java/javase/21/docs/specs/man/keytool.html + +If you're working with containers running Java applications and need to add a CA (Certificate Authority) certificate for secure communication, you can follow these steps. This guide assumes you are familiar with containers and have basic knowledge of working with YAML files. + +:toc: + + +== Problem Space + +If you have a containerized Java application that connects to an SSL endpoint with a certificate signed by an internal authority (like SSL terminated routes on a cluster) you need to make sure Java can read the CA Authority certificate and verify it. Java unfortunately doesn't load certificates directly, but rather store them in a {keytool-docs}[keystore]. + +The default trust store under `$JAVA_HOME/lib/security/cacerts` contains only CA's which are shipped with the Java distribution and there's the `keytool` tool that knows how manipulate those key stores. +The containerized application may not know the CA certificate in build time, and so we need to add it to the trust-store in deployment. To automate that we can a combination of an init-container and a shared directory to pass the mutated trust store to the container before it runs. Let's run this step by step: + +=== Step 1: Obtain the CA Certificate + +Before proceeding, ensure you have the CA certificate file (in PEM format) that you want to add to the Java container. If you don't have it, you may need to obtain it from your system administrator or certificate provider. + +For the purpose of this guide we would take the k8s cluster root CA that is automatically deployed into every container under `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` + +=== Step 2: Prepare a trust store in an init-container + +Add or amend this volumes and init-container snippet to your pod spec or podTemplate in a deployment: + +```yaml +spec: + volumes: + - name: new-cacerts + emptyDir: {} + initContainers: + - name: add-kube-root-ca-to-cacerts + image: registry.access.redhat.com/ubi9/openjdk-17 + volumeMounts: + - mountPath: /opt/new-cacerts + name: new-cacerts + command: + - /bin/bash + - -c + - | + cp $JAVA_HOME/lib/security/cacerts /opt/new-cacerts/ + chmod +w /opt/new-cacerts/cacerts + keytool -importcert -no-prompt -keystore /opt/new-cacerts/cacerts -storepass changeit -file /var/run/secrets/kubernetes.io/serviceaccount/ca.crt +``` + +The default keystore under $JAVA_HOME is part of the container image and is not mutable. We have to create the mutated copy to a shared volume, hence the 'new-cacerts' one. + +=== Step 3: Configure Java to load the new keystore + +Here we would just mount the new, modified cacerts into the default location where the JVM looks at. +The example main uses the standard http client so alternative we could mount the cacerts to a different location and Review Comment: yes that's the original meaning, I'll amend it -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
