Estoy comenzando con Docker compose y he estado trabajando a través de la sencilla aplicación de matraz de demostración. La cuestión es que estoy ejecutando esto desde el interior de una organización que intercepta todas las comunicaciones de tal manera que los errores SSL se lanzan de derecha a izquierda. Nos proporcionan tres certificados raíz que necesitamos instalar, y generalmente los tengo funcionando en mi propia máquina, pero estoy perdido cuando se trata de hacer que funcionen dentro de implementaciones compuestas por docker.

Cuando ejecuto docker-compose, obtengo lo siguiente:

$ sudo docker-compose up 
Creating network "project_default" with the default driver
Building web
Step 1/5 : FROM python:3.4-alpine
3.4-alpine: Pulling from library/python
81033e7c1d6a: Pull complete
9b61101706a6: Pull complete
415e2a07c89b: Pull complete
f22df7a3f000: Pull complete
8c16bf19c1f9: Pull complete
Digest: sha256:fe436cb066394d81cf49448a04dec7c765082445a500bc44f1ae5e8a455793bd
Status: Downloaded newer image for python:3.4-alpine
 ---> 5c72717ec319
Step 2/5 : ADD . /code
 ---> a5790c0e3e94
Removing intermediate container 052c614e41d0
Step 3/5 : WORKDIR /code
 ---> a2ea9acb3005
Removing intermediate container 77f2375ca0a6
Step 4/5 : RUN pip install -r requirements.txt
 ---> Running in 5f4fe856776d
Collecting flask (from -r requirements.txt (line 1))
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb0061f1d30>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb0061f19b0>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb0061f1828>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb0061f1588>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb0061f1390>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
  Could not find a version that satisfies the requirement flask (from -r requirements.txt (line 1)) (from versions: )
No matching distribution found for flask (from -r requirements.txt (line 1))

Pip no puede instalar nada.

El archivo docker-compose.yml tiene este aspecto:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Y el Dockerfile principal se ve así:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

¿Hay alguna manera de poder hacer que esto funcione en este caso particular? ¿Existe una solución general para este tipo de problema que me permita pasar a cualquier contenedor desplegado los certificados SSL y hacer que se usen?

3
Sean Lovell 23 feb. 2018 a las 13:46

4 respuestas

La mejor respuesta

Esta no es realmente una pregunta específica para el acoplador: en realidad, se pregunta "¿cómo instalo las autoridades de certificación en Linux"? La respuesta será la misma independientemente de si está ejecutando su cliente SSL dentro o fuera de un contenedor.

Su imagen de Python se basa en alpine, y alpine utiliza el paquete "ca-certificados" para administrar los certificados de CA. Para instalar sus certificados de CA locales, necesitaría (a) copiarlos en el directorio /usr/share/ca-certificates y (b) ejecutar update-ca-certificates.

Por ejemplo, agregar algo como esto a su Dockerfile (antes de su pip install):

COPY company-ca.crt /usr/share/ca-certificates
RUN update-ca-certificates
0
larsks 23 feb. 2018 a las 14:35

En mi caso, debo agregar en mi Dockerfile estas oraciones:

COPY company.crt /usr/local/share/ca-certificates/company.crt
RUN update-ca-certificates
...
RUN pip install --cert /etc/ssl/certs/company.pem -r requirements.txt

Necesita el certificado de su empresa en formato .crt. Cuando Docker ejecute los certificados de actualización-ca, Linux creará un archivo .pem con el mismo nombre en la ruta: / etc / ssl / certs /. Convertirá la red entre pip en SSL.

0
Andrés M. Jiménez 6 abr. 2019 a las 14:12

Estaba tratando de leer datos de una API en mi código Go y me enfrentaba a un error similar de SSL:

x509: certificate signed by unknown authority

Mi contenedor se basó en debian:stretch, que es realmente muy pequeño ~ 100MB. Esto sucede cuando ca-certificates no están instalados. Instalé ca-certificates (que también instala openssl) como se muestra a continuación:

FROM debian:stretch

RUN apt-get update && apt-get install -y ca-certificates --no-install-recommends && rm -rf /var/lib/apt/lists/*

# ...

Esto también funcionará para cualquier otra imagen base que no tenga ca-certificates instalada.

0
Shubham Chaudhary 1 abr. 2020 a las 19:47

En mi caso, la MTU de la máquina host es 1450 y la MTU de Docker es 1500.

Lo que hace que Docker establezca MSS en 1460, y luego el paquete TLS "servidor hola" se hizo más grande que 1450 bytes, por lo que la máquina Host lo descartó.

Para ver si también es su caso, ejecute ifconfig tanto en su contenedor Docker como en su máquina host. Si la MTU del Host es inferior a 1500, es fácil encontrarse con esta situación de descarte de paquetes. Especialmente en HTTPS, para ese "servidor hola" necesita enviar el certificado, que es un gran paquete

1
victor isildur 20 abr. 2019 a las 07:40