Skip to main content
Version: v1.8

Validate the signed image signature

Use hangar sign validate command for validate the signed image sigstore signature.

Quick Start

Use following command to verify the signed image after executing the sign command.

#!/bin/bash

hangar sign validate \
--file="example_image_list.txt" \
--sigstore-pubkey="sigstore.pub" \
--registry="REGISTRY_SERVER_URL" \
--jobs=4

Usage

hangar sign validate --help
Validate the signed images by sigstore public key with the
matchRepoDigestOrExact signedIdentity.

Usage:
hangar sign validate -f IMAGE_LIST.txt [flags]

Examples:
# Validate the signed images by sigstore public key file.
hangar validate \
--file IMAGE_LIST.txt \
--sigstore-pubkey SIGSTORE.pub \
--arch amd64,arm64 \
--os linux \
--exact-repository "registry.example.io/library/NAME"

Flags:
-a, --arch strings architecture list of images (default [amd64,arm64])
--exact-repository string validate the signed image with exactRepository signedIdentity
-o, --failed string file name of the sign failed image list (default "sign-failed.txt")
-f, --file string image list file
-h, --help help for validate
-j, --jobs int worker number, copy images parallelly (1-20) (default 1)
--os strings OS list of images (default [linux])
--project string override all image projects in image list
--registry string override all image registry URL in image list
-p, --sigstore-pubkey string sigstore public key file
--timeout duration timeout when mirror each images (default 10m0s)
--tls-verify require HTTPS and verify certificates

Global Flags:
--debug enable debug output
--insecure-policy run Hangar without policy check

Validate the mirrored image signature

By default, the mirror command will copy the sigstore signature when copying images. You can use the --remove-signatures option of mirror command to disable signature copy, and use the sign command to re-sign the container images with your own sigstore signature.

You need to specify the --exact-repository option of the sign validate command to use exactRepository signedBy identity when validating the image signature copied from other registry servers.

Here is an example:

  1. Mirror images to your personal Docker Hub project and sign with sigstore signature.

    Prepare an example image list file.

    example_image_list.txt
    USERNAME/alpine:latest

    Mirror and sign images.

    #!/bin/bash

    # Mirror container images to your Docker Hub personal project.
    hangar mirror \
    --file="example_image_list.txt" \
    --source="docker.io" \
    --destination="docker.io" \
    --source-project="library"

    # Sign images with sigstore private key.
    hangar sign \
    --file="example_image_list.txt" \
    --registry="docker.io" \
    --sigstore-key="sigstore.key"

    Now the image USERNAME/alpine:latest should have sigstore signature with its reference name docker.io/USERNAME/alpine:latest.

  2. Mirror the signed images to your private registry server.

    hangar mirror \
    --file "example_image_list.txt" \
    --source "docker.io" \
    --destination "REGISTRY_SERVER_URL"

    Now the reference of the image in the private registry server is REGISTRY_SERVER_URL/USERNAME/alpine:latest, but its sigstore signature reference is still docker.io/USERNAME/alpine:latest.

    The validate command will fail if the signature reference is not match with the image reference.

    #!/bin/bash

    hangar sign validate \
    --file="example_image_list.txt" \
    --sigstore-pubkey="sigstore.pub" \
    --registry="REGISTRY_SERVER_URL"

    [15:48:53] [ERRO] error occurred on [IMG: 1] [REGISTRY_SERVER_URL/USERNAME/alpine:latest]: failed to validate signature [docker://REGISTRY_SERVER_URL/USERNAME/alpine:latest]:
    error occurred when validate image [docker://REGISTRY_SERVER_URL/USERNAME/alpine:latest]: sign validate: None of the signatures were accepted, reasons:
    Signature for identity REGISTRY_SERVER_URL/USERNAME/alpine@sha256:25fd8fc1aefcc8ae46aae23daefcd7dcb97f676fa0bc72bb0bf7cfb75df4f22e is not accepted;
    Signature for identity REGISTRY_SERVER_URL/USERNAME/alpine@sha256:25fd8fc1aefcc8ae46aae23daefcd7dcb97f676fa0bc72bb0bf7cfb75df4f22e is not accepted

    The validate failed error message is like Signature for identity REGISTRY_SERVER_URL/USERNAME/alpine@sha256:... is not accepted.

  3. Validate the copied image signature with --exact-repository.

    Use --exact-repository to specify the signature exact repository.

    #!/bin/bash

    hangar sign validate \
    --file="example_image_list.txt" \
    --sigstore-pubkey="sigstore.pub" \
    --registry="REGISTRY_SERVER_URL" \
    --exact-repository="docker.io/USERNAME/alpine"

Use cosign to verify the signed image signature

You can use cosign to verify the Hangar signed sigstore signature.

  1. Use inspect to get the image digest to be verified.

    In this example, the digest is sha256:25fd8fc1aefcc8ae46aae23daefcd7dcb97f676fa0bc72ba0cf7c1b75df4f22e.

    #!/bin/bash

    hangar inspect --raw docker://REGISTRY_SERVER_URL/cnrancher/hangar:latest
    {
    "schemaVersion": 2,
    "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
    "manifests": [
    {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "size": 528,
    "digest": "sha256:25fd8fc1aefcc8ae46aae23daefcd7dcb97f676fa0bc72ba0cf7c1b75df4f22e",
    "platform": {
    "architecture": "amd64",
    "os": "linux"
    }
    }
    ]
    }

    Use cosign verify to verify the Hangar signed image.

    #!/bin/bash

    cosign verify \
    --key="./sigstore.pub" \
    --allow-http-registry=true \
    --insecure-ignore-tlog \
    REGISTRY_SERVER_URL/cnrancher/hangar@sha256:25fd8fc1aefcc8ae46aae23daefcd7dcb97f676fa0bc72ba0cf7c1b75df4f22e

    The --insecure-ignore-tlog is for skip finding signature record from transparency log since Hangar does not upload the signature to the cosign transparency log server.