Skip to main content
Argo CD releases are cryptographically signed using Sigstore cosign with identity-based (keyless) signing. This ensures that releases are authentic and have not been tampered with.

Prerequisites

Install the required verification tools:
# Install via Homebrew
brew install cosign slsa-verifier crane
Minimum versions: cosign v2.0.0+, slsa-verifier v2.0.0+

Release Assets

Each Argo CD release includes the following assets:
AssetDescription
argocd-darwin-amd64CLI Binary for macOS (Intel)
argocd-darwin-arm64CLI Binary for macOS (Apple Silicon)
argocd-linux-amd64CLI Binary for Linux (x86_64)
argocd-linux-arm64CLI Binary for Linux (ARM64)
argocd-linux-ppc64leCLI Binary for Linux (PowerPC)
argocd-linux-s390xCLI Binary for Linux (IBM Z)
argocd-windows-amd64.exeCLI Binary for Windows
argocd-cli.intoto.jsonlSLSA attestation of CLI binaries
argocd-sbom.intoto.jsonlSLSA attestation of SBOM
cli_checksums.txtSHA256 checksums of binaries
sbom.tar.gzSoftware Bill of Materials
sbom.tar.gz.pemCertificate used to sign SBOM
sbom.tar.gz.sigSignature of SBOM

Container Image Verification

Verify that a container image was built by the official Argo CD GitHub Actions workflow.

Using cosign

cosign verify \
  --certificate-identity-regexp https://github.com/argoproj/argo-cd/.github/workflows/image-reuse.yaml@refs/tags/v \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-github-workflow-repository "argoproj/argo-cd" \
  quay.io/argoproj/argocd:latest | jq
{
  "critical": {
    "identity": {
      "docker-reference": "quay.io/argoproj/argo-cd"
    },
    "image": {
      "docker-manifest-digest": "sha256:63dc60481b1b2abf271e1f2b866be8a92962b0e53aaa728902caa8ac8d235277"
    },
    "type": "cosign container image signature"
  },
  "optional": {
    "1.3.6.1.4.1.57264.1.1": "https://token.actions.githubusercontent.com",
    "1.3.6.1.4.1.57264.1.4": "Publish ArgoCD Release",
    "1.3.6.1.4.1.57264.1.5": "argoproj/argo-cd",
    "1.3.6.1.4.1.57264.1.6": "refs/tags/v2.11.3"
  }
}
The command performs these checks:
  • ✅ Cosign claims validated
  • ✅ Existence in transparency log verified offline
  • ✅ Certificates verified against Fulcio roots

Using slsa-verifier

Verify with SLSA Level 3 provenance attestation:
# Get immutable image digest to prevent TOCTOU attacks
IMAGE=quay.io/argoproj/argocd:v2.11.3
IMAGE="${IMAGE}@$(crane digest "${IMAGE}")"

# Verify provenance
slsa-verifier verify-image "$IMAGE" \
  --source-uri github.com/argoproj/argo-cd \
  --source-tag v2.11.3
Always use the immutable digest (SHA256) to prevent TOCTOU attacks where the tag could be updated between verification and deployment.

CLI Binary Verification

Each release includes a single attestation file (argocd-cli.intoto.jsonl) that can verify all CLI binaries.

Download and Verify

1

Download Binary and Attestation

VERSION=v2.11.3
PLATFORM=linux-amd64  # or darwin-amd64, windows-amd64, etc.

# Download CLI binary
curl -LO https://github.com/argoproj/argo-cd/releases/download/${VERSION}/argocd-${PLATFORM}

# Download attestation
curl -LO https://github.com/argoproj/argo-cd/releases/download/${VERSION}/argocd-cli.intoto.jsonl
2

Verify Binary

slsa-verifier verify-artifact argocd-${PLATFORM} \
  --provenance-path argocd-cli.intoto.jsonl \
  --source-uri github.com/argoproj/argo-cd \
  --source-tag ${VERSION}
Verified signature against tlog entry index 1234567890 at URL: https://rekor.sigstore.dev/api/v1/log/entries/...
Verified build using builder https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.9.0 at commit abc123...

PASSED: Verified SLSA provenance
3

Install Binary

chmod +x argocd-${PLATFORM}
sudo mv argocd-${PLATFORM} /usr/local/bin/argocd
argocd version

Semantic Version Verification

Verify against major or minor version instead of full version:
# Verify against minor version (v2.11.x)
slsa-verifier verify-artifact argocd-linux-amd64 \
  --provenance-path argocd-cli.intoto.jsonl \
  --source-uri github.com/argoproj/argo-cd \
  --source-versioned-tag v2.11

# Verify against major version (v2.x.x)
slsa-verifier verify-artifact argocd-linux-amd64 \
  --provenance-path argocd-cli.intoto.jsonl \
  --source-uri github.com/argoproj/argo-cd \
  --source-versioned-tag v2
slsa-verifier verify-artifact argocd-linux-amd64 \
  --provenance-path argocd-cli.intoto.jsonl \
  --source-uri github.com/argoproj/argo-cd \
  --source-tag v2.11.3 \
  --print-provenance | jq

SBOM Verification

Argo CD provides a Software Bill of Materials (SBOM) for supply chain security and vulnerability scanning.

Verify SBOM with SLSA

1

Download SBOM and Attestation

VERSION=v2.11.3
curl -LO https://github.com/argoproj/argo-cd/releases/download/${VERSION}/sbom.tar.gz
curl -LO https://github.com/argoproj/argo-cd/releases/download/${VERSION}/argocd-sbom.intoto.jsonl
2

Verify Attestation

slsa-verifier verify-artifact sbom.tar.gz \
  --provenance-path argocd-sbom.intoto.jsonl \
  --source-uri github.com/argoproj/argo-cd \
  --source-tag ${VERSION}
3

Extract and Inspect

tar -xzf sbom.tar.gz
cat sbom.json | jq '.components[] | select(.name | contains("golang"))'

Verify SBOM Signature (Alternative)

Verify using the signature and certificate files:
cosign verify-blob sbom.tar.gz \
  --signature sbom.tar.gz.sig \
  --certificate sbom.tar.gz.pem \
  --certificate-identity-regexp https://github.com/argoproj/argo-cd \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Verification in Kubernetes

Admission Controllers

Enforce image signature verification with Kyverno:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-argocd-images
spec:
  validationFailureAction: Enforce
  background: false
  rules:
  - name: verify-signature
    match:
      any:
      - resources:
          kinds:
          - Pod
          namespaces:
          - argocd
    verifyImages:
    - imageReferences:
      - "quay.io/argoproj/argocd*"
      attestors:
      - entries:
        - keyless:
            subject: "https://github.com/argoproj/argo-cd/.github/workflows/image-reuse.yaml@*"
            issuer: "https://token.actions.githubusercontent.com"
            rekor:
              url: https://rekor.sigstore.dev

Verify in CI/CD Pipeline

Integrate verification into your deployment pipeline:
name: Verify and Deploy
on:
  push:
    branches: [main]

jobs:
  verify-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Install cosign
      uses: sigstore/cosign-installer@v3
    
    - name: Verify Argo CD image
      run: |
        cosign verify \
          --certificate-identity-regexp https://github.com/argoproj/argo-cd/.github/workflows/image-reuse.yaml@refs/tags/v \
          --certificate-oidc-issuer https://token.actions.githubusercontent.com \
          --certificate-github-workflow-repository "argoproj/argo-cd" \
          quay.io/argoproj/argocd:${{ env.ARGOCD_VERSION }}
    
    - name: Deploy
      run: |
        kubectl apply -f argocd-install.yaml

Checksum Verification

For additional verification, compare checksums:
# Download checksum file
curl -LO https://github.com/argoproj/argo-cd/releases/download/v2.11.3/cli_checksums.txt

# Verify binary checksum
sha256sum -c cli_checksums.txt --ignore-missing

# Or manually:
sha256sum argocd-linux-amd64
grep argocd-linux-amd64 cli_checksums.txt

Troubleshooting

Error: none of the expected identities matchedCause: Certificate identity regexp doesn’t match the actual identitySolution: Verify you’re using the correct identity pattern for the version:
--certificate-identity-regexp https://github.com/argoproj/argo-cd/.github/workflows/image-reuse.yaml@refs/tags/v
Warning: Using mutable tag referenceSolution: Always use the digest for verification:
IMAGE="quay.io/argoproj/argocd:v2.11.3@$(crane digest quay.io/argoproj/argocd:v2.11.3)"
slsa-verifier verify-image "$IMAGE" ...
Error: failed to fetch transparency log entryCause: Cannot reach rekor.sigstore.devSolution: Ensure outbound HTTPS access to:
  • rekor.sigstore.dev (port 443)
  • fulcio.sigstore.dev (port 443)
  • tuf-repo-cdn.sigstore.dev (port 443)
Issue: Releases before v2.4.0 are not signedSolution: Upgrade to v2.4.0 or later to use signature verification. For older versions, rely on:
  • Checksum verification
  • Downloading from official GitHub releases only
  • Verifying Git tag signatures

Best Practices

Always Verify

Verify signatures for all production deployments

Use Admission Control

Enforce verification at the cluster level

Pin Digests

Use immutable image digests in production

Automate Verification

Integrate verification into CI/CD pipelines

Monitor Supply Chain

Use SBOM for vulnerability scanning

Trust Policy

Document which sources are trusted

Security Overview

Comprehensive security architecture

TLS Configuration

Configure component TLS certificates

Sigstore Documentation

Learn more about Sigstore and keyless signing

SLSA Framework

Supply chain security framework