Chapter 3. Verifying signed artifacts in an offline environment
In some cases, you need to verify an artifact’s authenticity, but do not have access to the Red Hat Trusted Artifact Signer (RHTAS) service that signed that artifact. In these cases, you can still verify an artifact’s signature by doing an offline verification.
Before you can start doing offline artifact verification, you need access to the RHTAS signing environment, and access to an image registry. In the offline environment, you only need access to the same image registry as the signing environment.
Prerequisites
- Installation of RHTAS running either on the Red Hat OpenShift Container Platform, or on Red Hat Enterprise Linux (RHEL) managed by Ansible.
-
A workstation with the
cosign
,tuftool
,tar
, andsha256sum
binaries installed. -
Initialization of
cosign
with the current signing environment.
Procedure
In the signing environment, do the following steps:
Sign an image by using
cosign
:cosign sign IMAGE_NAME:TAG
cosign sign IMAGE_NAME:TAG
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cosign sign -y ttl.sh/rhtas/example-image:1h
$ cosign sign -y ttl.sh/rhtas/example-image:1h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Get the Trust Root URL.
For RHTAS deployments on Red Hat Enterprise Linux:
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_SERVER_URL=https://tuf.${BASE_HOSTNAME}
$ export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE $ export TUF_SERVER_URL=https://tuf.${BASE_HOSTNAME}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow For RHTAS deployments on Red Hat OpenShift Container Platform:
export TUF_SERVER_URL="$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer)"
$ export TUF_SERVER_URL="$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Create a clone of the Trust Root locally:
export TUF_REPOSITORY="${HOME}/repository" tuftool clone --allow-root-download --metadata-dir "${TUF_REPOSITORY}" --targets-dir "${TUF_REPOSITORY}/targets" --metadata-url "${TUF_SERVER_URL}" --targets-url "${TUF_SERVER_URL}/targets"
$ export TUF_REPOSITORY="${HOME}/repository" $ tuftool clone --allow-root-download --metadata-dir "${TUF_REPOSITORY}" --targets-dir "${TUF_REPOSITORY}/targets" --metadata-url "${TUF_SERVER_URL}" --targets-url "${TUF_SERVER_URL}/targets"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a compressed archive file of the Trust Root:
tar -czvf repository.tar.gz "${TUF_REPOSITORY}" sha256sum repository.tar.gz
$ tar -czvf repository.tar.gz "${TUF_REPOSITORY}" $ sha256sum repository.tar.gz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Make note of the checksum output for use later in the offline environment.
Copy the compressed archive file to the offline environment.
ImportantYou must copy the Trust Root compressed archive file every time you update The Update Framework (TUF) metadata files or when you rotate any RHTAS component keys and certificates.
In the offline environment, do the following steps:
- Change directory to where you copied the compressed archive file of the Trust Root.
Verify the checksum by using the checksum value from the signing environment:
echo "SHA256_CHECKSUM repository.tar.gz" > checksum.txt sha256sum --check checksum.txt || echo "Archive integrity compromised, don't continue with the procedure\!"
$ echo "SHA256_CHECKSUM repository.tar.gz" > checksum.txt $ sha256sum --check checksum.txt || echo "Archive integrity compromised, don't continue with the procedure\!"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportantOnly continue if the integrity check is successful.
Expand the compressed archive file:
tar -xzvf repository.tar.gz
$ tar -xzvf repository.tar.gz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Initialize
cosign
:cd repository/ cosign initialize --mirror=file://$(pwd)/ --root=$(pwd)/1.root.json
$ cd repository/ $ cosign initialize --mirror=file://$(pwd)/ --root=$(pwd)/1.root.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the signed artifacts:
export IMAGE="IMAGE_NAME:TAG" export SIGNING_EMAIL_ADDR=SIGNING_EMAIL_ADDRESS export SIGNING_OIDC_ISSUER=OIDC_ISSUER_URL cosign verify --certificate-identity="${SIGNING_EMAIL_ADDR}" --certificate-oidc-issuer="${SIGNING_OIDC_ISSUER}" "${IMAGE}"
$ export IMAGE="IMAGE_NAME:TAG" $ export SIGNING_EMAIL_ADDR=SIGNING_EMAIL_ADDRESS $ export SIGNING_OIDC_ISSUER=OIDC_ISSUER_URL $ cosign verify --certificate-identity="${SIGNING_EMAIL_ADDR}" --certificate-oidc-issuer="${SIGNING_OIDC_ISSUER}" "${IMAGE}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow