Beta — Werfty is under active development. Interfaces may change between releases.
← Back to werfty.io

Werfty Trust Registry

trust.werfty.io is a public OCI registry that stores cosign-signed SBOM attestations for Docker images and Python packages. It runs on Zot and speaks standard OCI Distribution API — pull from it with cosign, oras, or any OCI-compliant client.

What is stored here

Every artifact pushed to the trust registry is a cosign attestation — an OCI artifact containing a signed SBOM payload alongside its cryptographic proof of origin.

Cosign attestations

Each attestation wraps a CycloneDX SBOM payload and is signed with a cosign key. The signature is stored as a co-located OCI tag (sha256-<digest>.att) next to the image or package reference it attests.

Attestations are addressable by the digest of the attested artifact. Verifying one requires only the public key and registry read access — no Werfty tooling required.

Supported artifact types

  • Docker image attestations — pushed by werfty-attest docker
  • PyPI package attestations — pushed by werfty-attest pypi

How to pull and verify

Verify a Docker image attestation with cosign

Pass the image reference and the Werfty public key. cosign resolves the attestation from the registry automatically.

cosign verify-attestation \
  --key https://werfty.io/cosign.pub \
  --type cyclonedx \
  trust.werfty.io/<namespace>/<image>:<tag>

On success, cosign prints the verified attestation payload as JSON to stdout. A non-zero exit means the attestation is missing, the signature is invalid, or the key does not match — do not trust the artifact.

Verify a PyPI package attestation with cosign

cosign verify-attestation \
  --key https://werfty.io/cosign.pub \
  --type cyclonedx \
  trust.werfty.io/pypi/<package>:<version>

Pull the raw SBOM payload with oras

Use oras pull to download the attestation blob directly if you want the CycloneDX JSON without going through cosign.

oras pull trust.werfty.io/<namespace>/<image>@sha256:<digest>

Use werfty-verify (recommended for CI)

werfty-verify wraps cosign verification and produces structured output. It gates the deploy on attestation validity.

# Verify a Docker image — exits 0 if trusted, 1 if untrusted, 2 on error
werfty-verify docker trust.werfty.io/<namespace>/<image>:<tag>

# Verify a PyPI package
werfty-verify pypi <package>==<version>

# Machine-readable output for scripting
werfty-verify docker trust.werfty.io/<namespace>/<image>:<tag> --json

Authentication

Read
trust.werfty.io

Open — no credentials required. Pull any attestation, verify any signature.

Write
trust.werfty.io

Requires credentials. Only authorised Werfty pipelines push attestations. Contact the Werfty team to discuss write access for your organisation.

Note: The registry enforces authentication on push. A bare GET /v2/ probe returns HTTP 401 — this is normal registry behaviour and does not mean the registry is unavailable. Any OCI client that supports anonymous pulls will work without configuration.

Raw OCI endpoint

The OCI Distribution API is available directly at trust.werfty.io/v2/. Expect a 401 Unauthorized JSON response on unauthenticated probe — this is the standard OCI registry challenge response, not an error.

Catalogue endpoint: GET https://trust.werfty.io/v2/_catalog — returns a JSON list of repositories.

This endpoint is for tooling and direct OCI client use. If you landed here from a browser link expecting a dashboard, you are in the right place — the registry does not serve a web UI.