# Verificar el cliente del repositorio con certificados


En [Proteger la comunicación de socket del demonio de Docker](/engine/security/certificates/protect-access/), aprendiste que, por defecto, Docker se ejecuta a través de un socket Unix sin red y que se debe habilitar TLS para que el cliente de Docker y el demonio se comuniquen de forma segura a través de HTTPS. TLS garantiza la autenticidad del endpoint del registro y que el tráfico hacia y desde el registro esté cifrado.

Este artículo demuestra cómo garantizar que el tráfico entre el servidor de registro de Docker y el demonio de Docker (un cliente del servidor de registro) esté cifrado y autenticado correctamente mediante la autenticación cliente-servidor basada en certificados.

Te mostramos cómo instalar un certificado raíz de Entidad de Certificación (CA) para el registro y cómo configurar el certificado TLS del cliente para su verificación.

## Entender la configuración

Un certificado personalizado se configura creando un directorio bajo `/etc/docker/certs.d` utilizando el mismo nombre que el nombre de host del registro, como `localhost`. Todos los archivos `*.crt` se añaden a este directorio como raíces de CA.

> [!NOTE]
> En Linux, cualquier entidad de certificación raíz se fusiona con los valores predeterminados del sistema, incluido el conjunto de CA raíz del host. Si ejecutas Docker en Windows Server o Docker Desktop para Windows con contenedores de Windows, los certificados predeterminados del sistema solo se utilizan cuando no se configuran certificados raíz personalizados.

La presencia de uno o más pares `<nombre_archivo>.key/cert` indica a Docker que se requieren certificados personalizados para acceder al repositorio deseado.

> [!NOTE]
> Si existen múltiples certificados, cada uno se prueba en orden alfabético. Si hay un error de autenticación de nivel 4xx o 5xx, Docker continúa probando con el siguiente certificado.

A continuación se ilustra una configuración con certificados personalizados:

```text
    /etc/docker/certs.d/        <-- Directorio de certificados
    └── localhost:5000          <-- Nombre de host:puerto
       ├── client.cert          <-- Certificado del cliente
       ├── client.key           <-- Clave del cliente
       └── ca.crt               <-- CA raíz que firmó
                                    el certificado del registro, en PEM
```

El ejemplo anterior es específico del sistema operativo y solo tiene fines ilustrativos. Debes consultar la documentación de tu sistema operativo para crear una cadena de certificados agrupados proporcionada por el SO.

## Crear los certificados de cliente

Utiliza los comandos `genrsa` y `req` de OpenSSL para generar primero una clave RSA y luego usar la clave para crear el certificado.

```console
$ openssl genrsa -out client.key 4096
$ openssl req -new -x509 -text -key client.key -out client.cert
```

> [!NOTE]
> Estos comandos TLS solo generan un conjunto funcional de certificados en Linux. La versión de OpenSSL en macOS es incompatible con el tipo de certificado que requiere Docker.

## Consejos para la resolución de problemas

El demonio de Docker interpreta los archivos `.crt` como certificados de CA y los archivos `.cert` como certificados de cliente. Si a un certificado de CA se le da accidentalmente la extensión `.cert` en lugar de la extensión correcta `.crt`, el demonio de Docker registra el siguiente mensaje de error:

```text
Missing key KEY_NAME for client certificate CERT_NAME. CA certificates should use the extension .crt.
```

Si se accede al registro de Docker sin un número de puerto, no añadas el puerto al nombre del directorio. A continuación se muestra la configuración para un registro en el puerto predeterminado 443 al que se accede con `docker login mi-registro-https.ejemplo.com`:

```text
    /etc/docker/certs.d/
    └── mi-registro-https.ejemplo.com          <-- Nombre de host sin puerto
       ├── client.cert
       ├── client.key
       └── ca.crt
```

## Información relacionada

* [Usar imágenes de confianza](/engine/security/certificates/trust/)
* [Proteger el socket del demonio de Docker](/engine/security/certificates/protect-access/)

