Compartir comentarios
Las respuestas se generan en base a la documentación.

Verificar el cliente del repositorio con certificados

En Proteger la comunicación de socket del demonio de Docker, 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:

    /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.

$ 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:

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:

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

Información relacionada