Quick Reference
Certificate Configuration
| Component | Secret Name | Hot Reload | Default Cert | Required SAN Entries |
|---|---|---|---|---|
argocd-server | argocd-server-tls | ✅ Yes | Self-signed | External hostname (e.g., argocd.example.com) |
argocd-repo-server | argocd-repo-server-tls | ❌ Restart required | Self-signed | DNS:argocd-repo-server, DNS:argocd-repo-server.argocd.svc |
argocd-dex-server | argocd-dex-server-tls | ❌ Restart required | Self-signed | DNS:argocd-dex-server, DNS:argocd-dex-server.argocd.svc |
Inter-Component TLS
| Connection | Strict TLS Parameter | Plain Text Parameter | Default Behavior |
|---|---|---|---|
argocd-server → argocd-repo-server | --repo-server-strict-tls | --repo-server-plaintext | Non-validating TLS |
argocd-server → argocd-dex-server | --dex-server-strict-tls | --dex-server-plaintext | Non-validating TLS |
argocd-application-controller → argocd-repo-server | --repo-server-strict-tls | --repo-server-plaintext | Non-validating TLS |
argocd-applicationset-controller → argocd-repo-server | --repo-server-strict-tls | --repo-server-plaintext | Non-validating TLS |
argocd-notifications-controller → argocd-repo-server | --argocd-repo-server-strict-tls | --argocd-repo-server-plaintext | Non-validating TLS |
Configuring argocd-server TLS
Inbound TLS Options
Configure TLS parameters for the API server:| Parameter | Default | Description |
|---|---|---|
--insecure | false | Disables TLS completely |
--tlsminversion | 1.2 | Minimum TLS version offered to clients |
--tlsmaxversion | 1.3 | Maximum TLS version offered to clients |
--tlsciphers | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_256_GCM_SHA384 | Colon-separated list of cipher suites |
Certificate Priority
Argo CD determines which certificate to use in this order:argocd-server-tls Secret
Recommended: Dedicated TLS secret for argocd-server
This secret is safe to manage via third-party tools like cert-manager or Sealed Secrets.
argocd-secret Secret
Deprecated: Legacy location for TLS certificateOnly used if
argocd-server-tls doesn’t exist. Not recommended for new deployments.Using cert-manager
Automate certificate management with cert-manager:- Let's Encrypt
- Internal CA
Configuring argocd-repo-server TLS
Inbound TLS Options
| Parameter | Default | Description |
|---|---|---|
--disable-tls | false | Disables TLS completely |
--tlsminversion | 1.2 | Minimum TLS version |
--tlsmaxversion | 1.3 | Maximum TLS version |
--tlsciphers | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_256_GCM_SHA384 | Cipher suites |
Certificate Configuration
Create theargocd-repo-server-tls secret:
Self-Signed Certificates
If using a self-signed certificate, add the CA certificate:Unlike argocd-server, argocd-repo-server requires a pod restart to pick up certificate changes.
Enable Strict TLS Validation
By default, components use non-validating TLS connections to argocd-repo-server. To enable strict validation:Configuring argocd-dex-server TLS
Inbound TLS Options
| Parameter | Default | Description |
|---|---|---|
--disable-tls | false | Disables TLS completely |
Certificate Configuration
Create theargocd-dex-server-tls secret:
Similar to repo-server, include correct SAN entries:
DNS:argocd-dex-serverDNS:argocd-dex-server.argocd.svc
Enable Strict TLS Validation
Service Mesh / mTLS Configuration
In service mesh environments with sidecar proxies (e.g., Istio, Linkerd), you may want to disable TLS between Argo CD components and let the mesh handle encryption.Disable TLS to repo-server
Configure repo-server
Disable TLS and restrict to loopback:
Listening on localhost prevents direct network access while allowing sidecar communication.
Disable TLS to dex-server
Complete Configuration Examples
Production Setup with cert-manager
Internal PKI Setup
Step-by-Step Internal PKI Configuration
Step-by-Step Internal PKI Configuration
-
Create internal CA
-
Install CA as cluster resource
-
Configure cert-manager with internal CA
- Request certificates Use the Certificate resources shown in previous examples.
Troubleshooting
Certificate not picked up
Certificate not picked up
Symptom: New certificate not being usedSolution:
- For
argocd-server: Wait up to 60 seconds (hot reload) - For
argocd-repo-serverandargocd-dex-server: Restart pods
TLS handshake errors
TLS handshake errors
Symptom:
x509: certificate is valid for X, not YSolution: Ensure SAN entries match the DNS names used by clients:Self-signed certificate errors
Self-signed certificate errors
Symptom:
x509: certificate signed by unknown authoritySolutions:- Add
ca.crtto the TLS secret - Enable strict TLS validation with proper CA trust
- Or use
--repo-server-plaintextif in service mesh
cert-manager not issuing
cert-manager not issuing
Check certificate status:Common issues:
- DNS not resolving for ACME challenges
- Rate limiting from Let’s Encrypt
- Incorrect issuer configuration
Best Practices
Use cert-manager
Automate certificate lifecycle management and rotation
Enable Strict TLS
Validate certificates for inter-component communication
Monitor Expiry
Set up alerts for certificates expiring within 30 days
Use Strong Ciphers
Configure TLS 1.2+ and modern cipher suites only
Related Resources
Security Overview
Comprehensive security architecture and threat model
Secrets Management
Best practices for managing secrets
Signed Releases
Verify Argo CD artifacts and images
cert-manager
Kubernetes certificate management