How to check Certificates Validation with script in Automation Suite?
Description: Verify the validity of the necessary certificates using the script below.
Steps:
- Login as a root user to any server ( if multinode) and create a file
sudo su - vi cert-validation-script.sh
- Copy the below content in the file
#!/bin/bash export KUBECONFIG="/etc/rancher/rke2/rke2.yaml" \ && export PATH="$PATH:/usr/local/bin:/var/lib/rancher/rke2/bin" echo "####################Checking Server Certificate##############################" echo "*******************************************************************************" # Array of namespaces and secrets declare -A SECRETS=( ["istio-system"]="istio-ingressgateway-certs" ["istio-system"]="istio-ca-cert" ["uipath"]="istio-ca-cert" ["uipath"]="istio-ingressgateway-certs") for NAMESPACE in "${!SECRETS[@]}"; do SECRET=${SECRETS[$NAMESPACE]} # Fetch the certificate data from the secret CERT_DATA=$(kubectl get secret $SECRET --namespace=$NAMESPACE -o jsonpath="{.data.tls\.crt}" 2>/dev/null) # If the certificate is not found, skip to the next iteration if [ -z "$CERT_DATA" ]; then echo "Certificate not found for secret $SECRET in namespace $NAMESPACE. Skipping..." continue fi # Decode the certificate data DECODED_CERT=$(echo $CERT_DATA | base64 --decode) # Write the decoded certificate data to a temporary file echo "$DECODED_CERT" > /tmp/cert.pem # Check the expiry of the certificate EXPIRY=$(openssl x509 -in /tmp/cert.pem -enddate -noout) echo "Secret $SECRET in namespace $NAMESPACE expires: $EXPIRY" # Get the expiry date of the certificate EXPIRY_DATE=$(openssl x509 -enddate -noout -in /tmp/cert.pem | cut -d= -f2) # Convert the expiry date to Unix timestamp EXPIRY_DATE_UNIX=$(date -d "$EXPIRY_DATE" +%s) # Get the current date as Unix timestamp CURRENT_DATE_UNIX=$(date +%s) # Check if the certificate has expired if [ $CURRENT_DATE_UNIX -gt $EXPIRY_DATE_UNIX ]; then echo "Certificate in secret $SECRET in namespace $NAMESPACE has expired." else echo "Certificate in secret $SECRET in namespace $NAMESPACE is valid." fi done echo "####################Checking Identity Certificate##############################" echo "*******************************************************************************" # Array of namespaces and secrets declare -A SECRETS=( ["uipath"]="identity-token-signing-certificate") for NAMESPACE in "${!SECRETS[@]}"; do SECRET=${SECRETS[$NAMESPACE]} # Fetch the certificate data from the secret CERT_DATA=$(kubectl get secret $SECRET --namespace=$NAMESPACE -o jsonpath="{.data.IdentityServer1\.pfx}"| base64 -d > /tmp/cert.pfx) # Fetch the password from the secret PASSWORD=$(kubectl -n $NAMESPACE get secret $SECRET -o jsonpath="{.data.password1}" | base64 -d) # Convert the PFX file to a PEM file openssl pkcs12 -in /tmp/cert.pfx -out /tmp/cert1.pem -passout pass:"${PASSWORD}" -passin pass:"${PASSWORD}" # Check the expiry of the certificate EXPIRY=$(openssl x509 -in /tmp/cert1.pem -enddate -noout) echo "Secret $SECRET in namespace $NAMESPACE expires: $EXPIRY" # Get the expiry date of the certificate EXPIRY_DATE=$(openssl x509 -enddate -noout -in /tmp/cert.pem | cut -d= -f2) # Convert the expiry date to Unix timestamp EXPIRY_DATE_UNIX=$(date -d "$EXPIRY_DATE" +%s) # Get the current date as Unix timestamp CURRENT_DATE_UNIX=$(date +%s) # Check if the certificate has expired if [ $CURRENT_DATE_UNIX -gt $EXPIRY_DATE_UNIX ]; then echo "Certificate in secret $SECRET in namespace $NAMESPACE has expired." else echo "Certificate in secret $SECRET in namespace $NAMESPACE is valid." fi done echo "####################Checking Webhook Certificate##############################" echo "*******************************************************************************" # Array of namespaces and secrets declare -A SECRETS=( ["cert-manager"]="cert-manager-webhook-ca" ["cattle-system"]="cattle-webhook-tls") for NAMESPACE in "${!SECRETS[@]}"; do SECRET=${SECRETS[$NAMESPACE]} # Fetch the certificate data from the secret CERT_DATA=$(kubectl get secret $SECRET --namespace=$NAMESPACE -o jsonpath="{.data.tls\.crt}" 2>/dev/null) # If the certificate is not found, skip to the next iteration if [ -z "$CERT_DATA" ]; then echo "Certificate not found for secret $SECRET in namespace $NAMESPACE. Skipping..." continue fi # Decode the certificate data DECODED_CERT=$(echo $CERT_DATA | base64 --decode) # Write the decoded certificate data to a temporary file echo "$DECODED_CERT" > /tmp/cert2.pem # Check the expiry of the certificate EXPIRY=$(openssl x509 -in /tmp/cert2.pem -enddate -noout) echo "Secret $SECRET in namespace $NAMESPACE expires: $EXPIRY" # Get the expiry date of the certificate EXPIRY_DATE=$(openssl x509 -enddate -noout -in /tmp/cert.pem | cut -d= -f2) # Convert the expiry date to Unix timestamp EXPIRY_DATE_UNIX=$(date -d "$EXPIRY_DATE" +%s) # Get the current date as Unix timestamp CURRENT_DATE_UNIX=$(date +%s) # Check if the certificate has expired if [ $CURRENT_DATE_UNIX -gt $EXPIRY_DATE_UNIX ]; then echo "Certificate in secret $SECRET in namespace $NAMESPACE has expired." else echo "Certificate in secret $SECRET in namespace $NAMESPACE is valid." fi done echo "####################Checking Rke2 Certificate##############################" echo "*******************************************************************************" # Directory containing the .crt files DIR="/var/lib/rancher/rke2/server/tls" # Get the current date as Unix timestamp CURRENT_DATE_UNIX=$(date +%s) # Loop over all .crt files in the directory for CERT in $DIR/*.crt; do # Get the expiry date of the certificate EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$CERT" | cut -d= -f2) # Print the expiry date echo "Expiry date of $CERT: $EXPIRY_DATE" # Convert the expiry date to Unix timestamp EXPIRY_DATE_UNIX=$(date -d "$EXPIRY_DATE" +%s) # Check if the certificate has expired if [ $CURRENT_DATE_UNIX -gt $EXPIRY_DATE_UNIX ]; then echo "Certificate $CERT has expired." else echo "Certificate $CERT is valid." fi done rm -rf /tmp/cert.pem /tmp/cert1.pem /tmp/cert2.pem /tmp/cert.pfx
- Save and exit the file ( "esc" ":" "wq!" hit "enter")
- Grant the execution permissions to the file and run the script
chmod +x cert-validation-script.sh ./cert-validation-script.sh
The script will verify the below certificates:
- Server
- Identity
- Webhook
- Rke2 Rancher
To update the certificates, do the following if any of the above have expired.
- Server: Follow the Documentation
- https://docs.uipath.com/automation-suite/automation-suite/2023.10/installation-guide/managing-the-certificates#updating-the-server-certificate
(change the version as per AS version)
- Identity:
- Navigate to the installation folder (likely found here: /opt/UiPathAutomationSuite/)
- Optional -It is easier to make a new folder in the installer directory:
mkdir certs
sudo ./configureUiPathAS.sh tls-cert get --outpath /opt/UiPathAutomationSuite//certs
Now in the /certs folder, see tls.crt and tls.key. Run the following command:
openssl pkcs12 -export -out identity.pfx -inkey tls.key -in tls.crt
There will be a prompt to set a password, make note of this password.
(You'll then have the new identity.pfx file in the /certs directory)
- Add the New Identity Certificate to Automation Suite
To add the new certificate, go back to the installer directory and run the following command (you’ll need to update the script to your installer version again and update the password with the one just created):
sudo ./configureUiPathAS.sh identity token-cert update --cert-file-path /opt/UiPathAutomationSuite//certs --password
- Rotate the New Identity Certificate for the Expired Version
Next rotate the expired cert for the new one added. Run the command:
sudo ./configureUiPathAS.sh identity token-cert rotate
To validate re-run the above script
- Webhook:
- Rotation of Expired webhook certificates, run the below commands
- Enable kubectl
sudo su - export KUBECONFIG="/etc/rancher/rke2/rke2.yaml" \ && export PATH="$PATH:/usr/local/bin:/var/lib/rancher/rke2/bin"
Rotate expired Certificate,
kubectl delete secret -n cattle-system cattle-webhook-tls kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io --ignore-not-found=true rancher.cattle.io kubectl delete pod -n cattle-system -l app=rancher-webhook
Ref: https://ranchermanager.docs.rancher.com/troubleshooting/other-troubleshooting-tips/expired-webhook-certificate-rotation
- Rke2 Certificate:
Default expiry period of RKE k8s certificate is 1 year and server-ca.crt is 10 year. If k8s certificates are expired then cluster won't be accessible
If client-rke2-controller.crt is expired and not valid follow below steps
- Run below commands on first master node. To identify first node, run below command ( for multinode)
cat /etc/rancher/rke2/config.yaml |grep -i ^server
Output of above command should be empty for first server node.
Run below commands on first master node,
- Run systemctl stop rke2-server.service to stop rke2 server
- Run rke2-killall.sh command to cleanup any remaining process from rke2
- Delete /var/lib/rancher/rke2/server/tls/dynamic-cert.json file. (Only on server nodes)
- Start rke2 server using systemctl start rke2-server.service
- Delete rke2-serving secret from kube-system namespace using kubectl delete secret -n kube-system rke2-serving command. (Note: kubectl commands may not be accessible in case of multi-node deployment until steps from 1st to 4th are executed, on required number of server nodes - for etcd quorum requirement. Delete rke2-serving secret as soon as rke2 server boot up.)
If cluster is having more than one server node then above systemctl start rke2-server.service command may not execute till completion as etcd will not be able to complete leader election. You can start executing same steps, from 1st to 4th, on other server nodes.
Once quorum for etcd will satisfy, rke2 server will be able to start rest of the control plane pods and you should see kubectl get nodes command passing.
Once server nodes are ready, you can perform below steps on agent nodes to recreate certificates.
- Run systemctl stop rke2-agent.service
- Run rke2-killall.sh
- Run systemctl start rke2-agent.service
If server-ca.crt is expired and not valid then follow below
Run below commands on first master node. To identify first node, run below command
cat /etc/rancher/rke2/config.yaml |grep -i ^server
Output of above command should be empty for first server node.
Run below commands on first master node
- Run systemctl stop rke2-agent.service
- Run rke2-killall.sh
- Run systemctl start rke2-agent.service