# Verificar una imagen o chart de Docker Hardened Images


Las Docker Hardened Images (DHI) y los charts incluyen atestaciones firmadas que verifican el proceso de compilación, el contenido y la postura de seguridad.

La clave pública de Docker para las imágenes y charts de DHI se publica en:

- https://registry.scout.docker.com/keyring/dhi/latest.pub
- https://github.com/docker-hardened-images/keyring

Docker recomienda usar [Docker Scout](/scout/), pero puedes usar [`regctl`](https://github.com/regclient/regclient) y [`cosign`](https://docs.sigstore.dev/) para recuperar y verificar las atestaciones. Docker Scout ofrece varias ventajas clave: comprende las estructuras de atestación de DHI, resuelve automáticamente las plataformas, proporciona resúmenes legibles por humanos, valida en un solo paso con `--verify` y se integra estrechamente con la infraestructura de atestación de Docker.

> [!IMPORTANT]
>
> Debes autenticarte en el registro de Docker Hardened Images (`dhi.io`) para descargar las imágenes. Usa tus credenciales de Docker ID (el mismo usuario y contraseña que usas para Docker Hub) al iniciar sesión. Si no tienes una cuenta de Docker, [crea una](/accounts/create-account/) de forma gratuita.
>
> Ejecuta `docker login dhi.io` para autenticarte.

## Verificar atestaciones de imágenes

> [!NOTE]
>
> Antes de ejecutar comandos de `docker scout attest`, asegúrate de que cualquier imagen que hayas descargado localmente esté actualizada con respecto a la imagen remota. Puedes hacerlo ejecutando `docker pull`. Si no lo haces, es posible que veas el mensaje `No attestation found`.

### Listar las atestaciones disponibles

Para listar las atestaciones de una imagen de DHI replicada:

**Docker Scout**



> [!NOTE]
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer al nombre de la imagen el prefijo `registry://`. Por ejemplo, usa `registry://dhi.io/python:3.13` en lugar de `dhi.io/python:3.13`.

```console
$ docker scout attest list dhi.io/<image>:<tag>
```

Este comando muestra todas las atestaciones disponibles, incluyendo SBOM, procedencia, informes de vulnerabilidades y más.

**regctl**



Primero, autentícate en ambos registros. Prepara un [token de acceso personal (PAT)](/security/access-tokens/) para tu usuario con acceso `read only`:

> [!WARNING]
>
> Los siguientes ejemplos exportan las credenciales directamente en la línea de comandos con fines de demostración. Esto expone tokens sensibles en el historial de la shell y en la lista de procesos. En entornos de producción, utiliza métodos seguros como leer desde archivos con permisos restringidos, archivos de entorno cargados en tiempo de ejecución o herramientas de gestión de secretos.

```console
$ export DOCKER_USERNAME="YOUR_DOCKER_USERNAME"
$ export DOCKER_PAT="YOUR_DOCKER_PAT"
$ export DOCKER_ORG="YOUR_DOCKER_ORG"
$ echo $DOCKER_PAT | regctl registry login -u "$DOCKER_USERNAME" --pass-stdin docker.io
$ echo $DOCKER_PAT | regctl registry login -u "$DOCKER_USERNAME" --pass-stdin registry.scout.docker.com
```

Luego, lista las atestaciones utilizando la opción `--external`. Los repositorios de DHI almacenan las capas de las imágenes en `dhi.io` (o `docker.io` para imágenes replicadas) y las atestaciones firmadas en `registry.scout.docker.com`:

```console
$ regctl artifact list docker.io/${DOCKER_ORG}/<image>:<tag> \
  --external registry.scout.docker.com/${DOCKER_ORG}/<image> \
  --platform linux/amd64
```

Por ejemplo:

```console
$ regctl artifact list docker.io/${DOCKER_ORG}/dhi-node:22 \
  --external registry.scout.docker.com/${DOCKER_ORG}/dhi-node \
  --platform linux/amd64
```



### Recuperar una atestación específica

**Docker Scout**



Para recuperar una atestación específica, usa la opción `--predicate-type` con la URI completa del tipo de predicado:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  dhi.io/<image>:<tag>
```

> [!NOTE]
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer al nombre de la imagen el prefijo `registry://`. Por ejemplo, usa `registry://dhi.io/python:3.13` en lugar de `dhi.io/python:3.13`.

Por ejemplo:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  dhi.io/python:3.13
```

Para recuperar únicamente el cuerpo del predicado:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  --predicate \
  dhi.io/<image>:<tag>
```

**regctl**



Una vez que hayas listado las atestaciones, descarga el artefacto de atestación completo utilizando el resumen del campo `Name`:

```console
$ regctl artifact get <attestation-digest> > attestation.json
```

Por ejemplo, para guardar una atestación de procedencia SLSA:

```console
$ regctl artifact get registry.scout.docker.com/${DOCKER_ORG}/dhi-node@sha256:6cbf803796e281e535f2681de7cd33a1012202610322a50ee745d1bb02ac3c18 > slsa_provenance.json
```



### Validar la atestación

**Docker Scout**



Para validar la atestación utilizando Docker Scout, puedes usar la opción `--verify`:

```console
$ docker scout attest get dhi.io/<image>:<tag> \
   --predicate-type https://scout.docker.com/sbom/v0.1 --verify
```

> [!NOTE]
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer al nombre de la imagen el prefijo `registry://`. Por ejemplo, usa `registry://dhi.io/node:20.19-debian12` en lugar de `dhi.io/node:20.19-debian12`.

Por ejemplo, para verificar la atestación SBOM para la imagen `dhi.io/node:20.19-debian12`:

```console
$ docker scout attest get dhi.io/node:20.19-debian12 \
   --predicate-type https://scout.docker.com/sbom/v0.1 --verify
```

**cosign**



Una vez que hayas listado las atestaciones y obtenido el resumen del campo `Name`, verifícalas usando cosign:

```console
$ cosign verify \
  <attestation-digest-from-name-field> \
  --key https://registry.scout.docker.com/keyring/dhi/latest.pub \
  --insecure-ignore-tlog=true
```

Por ejemplo:

```console
$ cosign verify \
  registry.scout.docker.com/${DOCKER_ORG}/dhi-node@sha256:6cbf803796e281e535f2681de7cd33a1012202610322a50ee745d1bb02ac3c18 \
  --key https://registry.scout.docker.com/keyring/dhi/latest.pub \
  --insecure-ignore-tlog=true
```

> [!NOTE]
>
> La opción `--insecure-ignore-tlog=true` es necesaria porque las atestaciones de DHI pueden no registrarse en el registro de transparencia público de Rekor para proteger la información privada del cliente. La firma de la atestación se sigue verificando con la clave pública de Docker.



#### Gestionar la falta de entradas en el registro de transparencia

Al usar `--verify` con Docker Scout o `cosign verify`, a veces puedes ver un error como:

```text
ERROR no matching signatures: signature not found in transparency log
```

Esto ocurre porque las Docker Hardened Images no siempre registran las atestaciones en el registro de transparencia público de [Rekor](https://docs.sigstore.dev/logging/overview/). En los casos en que una atestación contendría información privada del usuario (por ejemplo, el espacio de nombres de tu organización en la referencia de la imagen), escribirla en Rekor expondría esa información públicamente.

Incluso si falta la entrada en Rekor, la atestación sigue estando firmada con la clave pública de Docker y puede verificarse sin conexión omitiendo la comprobación del registro de transparencia de Rekor.

Para omitir la comprobación del registro de transparencia y validar con la clave de Docker, usa la opción `--skip-tlog`:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  dhi.io/<image>:<tag> \
  --verify --skip-tlog
```

> [!NOTE]
>
> La opción `--skip-tlog` solo está disponible en la versión 1.18.2 y posteriores de la CLI de Docker Scout.
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer al nombre de la imagen el prefijo `registry://`. Por ejemplo, usa `registry://dhi.io/python:3.13` en lugar de `dhi.io/python:3.13`.

Esto equivale a usar `cosign` con la opción `--insecure-ignore-tlog=true`, que valida la firma con la clave pública publicada de Docker pero ignora la comprobación del registro de transparencia.

### Mostrar el comando cosign equivalente

Al usar la opción `--verify`, también se imprime el comando [cosign](https://docs.sigstore.dev/) correspondiente para verificar la firma de la imagen:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  --verify \
  dhi.io/<image>:<tag>
```

> [!NOTE]
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer al nombre de la imagen el prefijo `registry://`. Por ejemplo, usa `registry://dhi.io/python:3.13` en lugar de `dhi.io/python:3.13`.

Por ejemplo:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  --verify \
  dhi.io/python:3.13
```

Si la verificación tiene éxito, Docker Scout imprime el comando `cosign verify` completo.

Ejemplo de salida:

```console
     SBOM obtenido de la atestación, se encontraron 101 paquetes
     Procedencia obtenida de la atestación
     cosign verify ...
```

> [!IMPORTANT]
>
> Al usar cosign, primero debes autenticarte tanto en el registro de DHI como en el registro de Docker Scout.
>
> Por ejemplo:
>
> ```console
> $ docker login dhi.io
> $ docker login registry.scout.docker.com
> $ cosign verify ...
> ```

## Verificar atestaciones de paquetes

Además de las atestaciones de imágenes, los paquetes securizados individuales tienen sus propias atestaciones. Estas atestaciones a nivel de paquete te dejan verificar la procedencia y la información de compilación de paquetes específicos dentro de una imagen.

Para obtener instrucciones sobre cómo extraer información de paquetes de las atestaciones de imágenes y recuperar atestaciones a nivel de paquete, consulta [Atestaciones de paquetes](/dhi/how-to/hardened-packages/#atestaciones-de-paquetes).

## Verificar las atestaciones de Helm charts con Docker Scout

Los charts de Helm de Docker Hardened Image incluyen las mismas atestaciones completas que las imágenes de contenedor. El proceso de verificación para los charts es idéntico al de las imágenes, utilizando los mismos comandos de la CLI de Docker Scout.

### Listar las atestaciones de charts disponibles

Para listar las atestaciones de un Helm chart de DHI:

```console
$ docker scout attest list dhi.io/<chart>:<version>
```

Por ejemplo, para listar las atestaciones del chart external-dns:

```console
$ docker scout attest list dhi.io/external-dns-chart:1.20.0
```

Este comando muestra todas las atestaciones de charts disponibles, incluyendo SBOM, procedencia, informes de vulnerabilidades y más.

### Recuperar una atestación de chart específica

Para recuperar una atestación específica de un Helm chart, usa la opción `--predicate-type` con la URI completa del tipo de predicado:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  dhi.io/<chart>:<version>
```

Por ejemplo:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  dhi.io/external-dns-chart:1.20.0
```

Para recuperar únicamente el cuerpo del predicado:

```console
$ docker scout attest get \
  --predicate-type https://cyclonedx.org/bom/v1.6 \
  --predicate \
  dhi.io/<chart>:<version>
```

### Validar atestaciones de charts con Docker Scout

Para validar una atestación de chart utilizando Docker Scout, usa la opción `--verify`:

```console
$ docker scout attest get dhi.io/<chart>:<version> \
   --predicate-type https://scout.docker.com/sbom/v0.1 --verify
```

Por ejemplo, para verificar la atestación SBOM del chart external-dns:

```console
$ docker scout attest get dhi.io/external-dns-chart:1.20.0 \
   --predicate-type https://scout.docker.com/sbom/v0.1 --verify
```

La misma opción `--skip-tlog` descrita en [Gestionar la falta de entradas en el registro de transparencia](#gestionar-la-falta-de-entradas-en-el-registro-de-transparencia) también se puede usar con las atestaciones de charts cuando sea necesario.

## Atestaciones de DHI disponibles

Consulta las [atestaciones disponibles](/dhi/core-concepts/attestations/#image-attestations) para ver una lista de las atestaciones disponibles para cada imagen de DHI, y las [atestaciones de Helm charts](/dhi/core-concepts/attestations/#helm-chart-attestations) para ver una lista de las atestaciones disponibles para cada chart de DHI.

## Explorar atestaciones en Docker Hub

También puedes explorar las atestaciones visualmente al [examinar una variante de imagen](/dhi/how-to/explore/#detalles-de-la-variante-de-la-imagen). La sección **Attestations** muestra cada atestación disponible con su:

- Tipo (por ejemplo, SBOM, VEX)
- URI del tipo de predicado
- Referencia del resumen (digest) para usar con `cosign`

Estas atestaciones se generan y firman automáticamente como parte del proceso de compilación del chart o de la Docker Hardened Image.
