How to debug certificate issues in Automation Suite
This article describes how to debug certificate issues in Automation Suite.
CSR Generated Incorrectly
The CSR must include a [SAN] extension block with all required Automation Suite subdomains.
If the CSR is generated without the domains, the resulting certificate will be missing Subject Alternative Names. Modern browsers and Kubernetes components reject certificates that have a CN but no SAN.
Common mistakes include forgetting subdomains such as alm., monitoring., registry., objectstore., insights., or apps.
The correct CSR generation can be found in the Docs: Automation Suite - Managing the certificates
Verify the CSR has SANs before submitting to CA:
openssl req -text -noout -in automationsuite.maf.ae.csr | grep -A5 "Subject Alternative"
Wrong AS_FQDN in the CSR
The CN and SAN entries in the certificate do not match what is actually configured as the cluster FQDN - browsers, robots, and Istio all reject the certificate with TLS errors.
Evidence from this cluster: The Istio proxy logs show the actual FQDN in use. If the CSR was generated with a different value (e.g., a short hostname, an IP, or a staging FQDN), every HTTPS request would fail TLS verification.
This is how you check the deployed certificate's SANs:
./bin/uipathctl config tls-certificates get --show-details
or directly from the secret:
kubectl -n istio-system get secret istio-ingressgateway-certs -o jsonpath='{.data.tls\.crt}' \
| base64 -d | openssl x509 -text -noout | grep -A5 "Subject Alternative"
What to look for:
SANs must include all 7 entries: the baseFQDN plus alm., monitoring., registry., objectstore., insights., apps. Subdomains or a wildcard can be used to include all *.FQDN- If the
FQDNis wrong you must generate a new CSR with the correctAS_FQDN, obtain a new certificate from your CA, and then update it.
Automation Suite Server Certificate Expired
The self-signed certificate generated at install time expires in 90 days. If not replaced with a CA signed certificate, the entire platform becomes inaccessible.
How to check expiry:
./bin/uipathctl config tls-certificates get --show-details
How to update the server certificate (reference here):
- Decrypt the private key if it is encrypted:
openssl rsa -in /path/to/encrypted/server.key -out /path/to/decrypted/server.key
- Ensure server.crt contains the full chain (leaf + intermediate + root):
-----BEGIN CERTIFICATE----- ← server cert
...
-----BEGIN CERTIFICATE----- ← root CA chain
…
- Run the update:
./bin/uipathctl config tls-certificates update \
--cert server.crt \
--cacert ca.crt \
--key server.key
Note: Certificates are stored in the istio-ingressgateway-certs secret in the istio-system namespace and mirrored into the uipath namespace. Both locations are updated by uipathctl.
RKE2 Certificate Expired
The kube-apiserver log will show the KubeClientCertificateExpiration critical alert.
By default, RKE2 certificates expire after 12 months and auto-rotate only within the 90-day window before expiry (on service restart). If the cluster was never restarted in that window, the certificates expire.
- Check expiry on any node as mentioned in the Docs here.
- Rotate RKE2 certificates on each server node (repeat for all server nodes):
- Stop RKE2
systemctl stop rke2-server.service
- Kill remaining processes
rke2-killall.sh
- Delete the dynamic cert file
rm /var/lib/rancher/rke2/server/tls/dynamic-cert.json
- (Recommended) Extend validity to avoid recurrence
mkdir -p /etc/systemd/system/rke2-server.service.d/
cat > /etc/systemd/system/rke2-server.service.d/cert.conf <<EOF
[Service]
Environment="CATTLE_NEW_SIGNED_CERT_EXPIRATION_DAYS=1000"
EOF
systemctl daemon-reload
- Restart
systemctl start rke2-server.service
- Delete the serving secret so it regenerates:
kubectl delete secret -n kube-system rke2-serving
On each agent node:
systemctl stop rke2-agent.service
rke2-killall.sh
mkdir -p /etc/systemd/system/rke2-agent.service.d/
cat > /etc/systemd/system/rke2-agent.service.d/cert.conf <<EOF
[Service]
Environment="CATTLE_NEW_SIGNED_CERT_EXPIRATION_DAYS=1000"
EOF
systemctl daemon-reload
systemctl start rke2-agent.service
Important: In a multi-node cluster, perform steps 1–4 on the minimum number of server nodes needed to reach etcd quorum (at least 2 of 3) before running kubectl commands. The kubectl delete secret step can be done as soon as the RKE2 server starts.
After certs are rotated, Redis, config-discovery, and Orchestrator should self-recover.
If not, delete the stuck recovery job pod to unblock Redis:
kubectl delete pods -n redis-system -l job-name=redis-cluster-recovery-job --field-selector=status.phase=Running
Identity Certificate Expired
In case the automatic certificate rotation is not enabled and the platform is not reachable anymore (for example, getting a no healthy upstream error message), it might be that the identity certificate expired.
This can be confirmed by looking into the errors from the orchestrator and identity-server-api logs.
Look for: IdentityServer4.Services.DefaultTokenCreationService Certificate CN=xxxxxxxx, OU=xxxxxx, O=xxxxxxxx , L=xxxxxx, C=US has expired on …
It can be also confirmed by running the diagnostic tool here.
In case the identity certificate has expired, follow the steps in the Docs here to renew it.
Note: For different Automation Suite versions, adjust the documentation version from the drop-down button to match your current version.