# Utilizar certificados CA con Docker


> [!CAUTION]
> Se deben seguir las mejores prácticas al utilizar certificados CA de Man-in-the-Middle (MITM) en contenedores de producción. Si se ven comprometidos, los atacantes podrían interceptar datos confidenciales, suplantar un servicio de confianza o realizar ataques de intermediario (man-in-the-middle). Consulta a tu equipo de seguridad antes de continuar.

Si tu empresa utiliza un proxy que inspecciona el tráfico HTTPS, es posible que debas añadir los certificados raíz requeridos a tu máquina host y a tus contenedores o imágenes de Docker. Esto se debe a que Docker y sus contenedores, al descargar imágenes o realizar solicitudes de red, necesitan confiar en los certificados del proxy.

En el host, añadir el certificado raíz garantiza que cualquier comando de Docker (como `docker pull`) funcione sin problemas. Para los contenedores, deberás añadir el certificado raíz al almacén de confianza del contenedor, ya sea durante el proceso de construcción o en tiempo de ejecución. Esto garantiza que las aplicaciones que se ejecutan dentro de los contenedores puedan comunicarse a través del proxy sin encontrar advertencias de seguridad o fallos de conexión.

## Añadir el certificado CA al host

Las siguientes secciones describen cómo instalar certificados CA en tu host macOS o Windows. Para Linux, consulta la documentación de tu distribución.

### macOS

1. Descarga el certificado CA para tu software de proxy MITM.
2. Abre la aplicación **Acceso a Llaveros** (Keychain Access).
3. En Acceso a Llaveros, selecciona **Sistema** (System) y luego cambia a la pestaña **Certificados** (Certificates).
4. Arrastra y suelta el certificado descargado en la lista de certificados. Introduce tu contraseña si se te solicita.
5. Busca el certificado recién añadido, haz doble clic en él y despliega la sección **Confiar** (Trust).
6. Configura **Confiar siempre** (Always Trust) para el certificado. Introduce tu contraseña si se te solicita.
7. Inicia Docker Desktop y verifica que `docker pull` funcione, asumiendo que Docker Desktop está configurado para utilizar el proxy MITM.

### Windows

Elige si deseas instalar el certificado utilizando la Consola de administración de Microsoft (MMC) o tu navegador web.

**MMC**



1. Descarga el certificado CA para tu software de proxy MITM.
2. Abre la Consola de administración de Microsoft (`mmc.exe`).
3. Agrega el **Complemento de Certificados** (Certificates Snap-In) en la MMC.
   1. Selecciona **Archivo** (File) → **Agregar o quitar complemento** (Add/Remove Snap-in), y luego selecciona **Certificados** (Certificates) → **Agregar >** (Add >).
   2. Selecciona **Cuenta de equipo** (Computer Account) y luego **Siguiente** (Next).
   3. Selecciona **Equipo local** (Local computer) y luego selecciona **Finalizar** (Finish).
4. Importa el certificado CA:
   1. Desde la MMC, despliega **Certificados (Equipo local)**.
   2. Despliega la sección **Entidades de certificación raíz de confianza** (Trusted Root Certification Authorities).
   3. Haz clic con el botón derecho en **Certificados** y selecciona **Todas las tareas** (All Tasks) e **Importar…** (Import…).
   4. Sigue las instrucciones para importar tu certificado CA.
5. Selecciona **Finalizar** y luego **Cerrar**.
6. Inicia Docker Desktop y verifica que `docker pull` se realice correctamente (asumiendo que Docker Desktop ya está configurado para utilizar el servidor proxy MITM).

> [!NOTE]
> Dependiendo del SDK y/o runtime/framework en uso, pueden ser necesarios pasos adicionales más allá de agregar el certificado CA al almacén de confianza del sistema operativo.

**Navegador web**



1. Descarga el certificado CA para tu software de proxy MITM.
2. Abre tu navegador web, ve a **Configuración** y abre **Administrar certificados**.
3. Selecciona la pestaña **Entidades de certificación raíz de confianza**.
4. Selecciona **Importar**, luego busca el certificado CA descargado.
5. Selecciona **Abrir**, luego elige **Colocar todos los certificados en el siguiente almacén**.
6. Asegúrate de que esté seleccionado **Entidades de certificación raíz de confianza** y selecciona **Siguiente**.
7. Selecciona **Finalizar** y luego **Cerrar**.
8. Inicia Docker Desktop y verifica que `docker pull` se realice correctamente (asumiendo que Docker Desktop ya está configurado para utilizar el servidor proxy MITM).



## Añadir certificados CA a imágenes y contenedores Linux

Si necesitas ejecutar cargas de trabajo contenedorizadas que dependen de certificados internos o personalizados, como en entornos con proxies corporativos o servicios seguros, debes asegurarte de que los contenedores confíen en estos certificados. Sin añadir los certificados CA necesarios, las aplicaciones dentro de tus contenedores pueden experimentar fallos en las solicitudes o advertencias de seguridad al intentar conectarse a puntos de conexión HTTPS.

Al [añadir certificados CA a las imágenes](#añadir-certificados-a-las-imagenes) en el momento de la construcción, garantizas que cualquier contenedor que se inicie a partir de la imagen confiará en los certificados especificados. Esto es de especial importancia para las aplicaciones que requieren un acceso fluido a API internas, bases de datos u otros servicios durante la producción.

En los casos en que no sea factible volver a construir la imagen, puedes [añadir certificados a los contenedores](#añadir-certificados-a-los-contenedores) directamente. Sin embargo, los certificados añadidos en tiempo de ejecución no persistirán si el contenedor se destruye o se vuelve a crear, por lo que este método suele utilizarse para soluciones temporales o escenarios de prueba.

## Añadir certificados a las imágenes

> [!NOTE]
> Los siguientes comandos son para una imagen base de Ubuntu. Si tu construcción utiliza una distribución de Linux diferente, utiliza los comandos equivalentes para la gestión de paquetes (`apt-get`, `update-ca-certificates`, etc.).

Para añadir un certificado CA a una imagen de contenedor cuando la estás construyendo, la siguiente instrucción en tu Dockerfile.
(Wait! Let's say: Para añadir un certificado CA a una imagen de contenedor cuando la estás construyendo, añade las siguientes instrucciones a tu Dockerfile.)

```dockerfile
# Instala el paquete ca-certificates
RUN apt-get update && apt-get install -y ca-certificates
# Copia el certificado CA desde el contexto al contenedor de construcción
COPY tu_certificado.crt /usr/local/share/ca-certificates/
# Actualiza los certificados CA en el contenedor
RUN update-ca-certificates
```

### Añadir certificados a los contenedores

> [!NOTE]
> Los siguientes comandos son para un contenedor basado en Ubuntu. Si tu contenedor utiliza una distribución de Linux diferente, utiliza los comandos equivalentes para la gestión de paquetes (`apt-get`, `update-ca-certificates`, etc.).

Para añadir un certificado CA a un contenedor Linux en ejecución:

1. Descarga el certificado CA para tu software de proxy MITM.
2. Si el certificado está en un formato diferente a `.crt`, conviértelo al formato `.crt`:

   ```console {title="Comando de ejemplo"}
   $ openssl x509 -in cacert.der -inform DER -out myca.crt
   ```

3. Copia el certificado en el contenedor en ejecución:

    ```console
    $ docker cp myca.crt <containerid>:/tmp
    ```

4. Conéctate al contenedor:

    ```console
    $ docker exec -it <containerid> sh
    ```

5. Asegúrate de que el paquete `ca-certificates` esté instalado (requerido para actualizar los certificados):

    ```console
    # apt-get update && apt-get install -y ca-certificates
    ```

6. Copia el certificado a la ubicación correcta para los certificados CA:

    ```console
    # cp /tmp/myca.crt /usr/local/share/ca-certificates/root_cert.crt
    ```

7. Actualiza los certificados CA:

    ```console
    # update-ca-certificates
    ```

    ```plaintext {title="Ejemplo de salida"}
    Updating certificates in /etc/ssl/certs...
    rehash: warning: skipping ca-certificates.crt, it does not contain exactly one certificate or CRL
    1 added, 0 removed; done.
    ```

8. Verifica que el contenedor pueda comunicarse a través del proxy MITM:

    ```console
    # curl https://example.com
    ```

    ```plaintext {title="Ejemplo de salida"}
    <!doctype html>
    <html>
    <head>
        <title>Example Domain</title>
    ...
    ```

