# ============================================================ # lab-net-tls — el mismo contenido por HTTP y por HTTPS # ------------------------------------------------------------ # Lo usa la leccion f02-tls: ver el handshake, seguir la cadena # de confianza hasta una CA que has creado tu, y comprobar que # la verificacion se puede apagar con una sola bandera. # # host # ├── 127.0.0.1:8093 ──► web-http (texto en claro) # └── 127.0.0.1:8443 ──► web-tls (TLS con certificado propio) # │ # │ tls_interna (internal: true) # ┌────────┴────────┬──────────┐ # ▼ ▼ ▼ # ca cliente volumen certs # # La CA vive DENTRO del laboratorio. No se toca el almacen de # confianza de tu maquina en ningun momento: el certificado raiz # se pasa a curl con --cacert, que es exactamente lo que hay que # hacer y no lo que hace la mitad de los tutoriales. # # docker compose up -d --build levantar (genera los certificados) # docker compose down -v destruir, certificados incluidos # ============================================================ name: lab-net-tls networks: # Los dos servidores publican en el host, asi que necesitan una # red con salida. Todo lo demas vive aislado. tls_borde: driver: bridge tls_interna: driver: bridge internal: true volumes: # Aqui aterrizan la CA y el certificado del servidor. Se # destruye con "down -v", asi que cada reinicio del laboratorio # empieza con material criptografico nuevo. certs: services: # --- autoridad certificadora del laboratorio -------------- # Arranca, genera lo que falte y termina. No es un servicio que # se quede vivo: emitir un certificado es un acto puntual. ca: build: ./herramientas image: labnettls-herramientas container_name: labnettls-ca command: ["sh", "/opt/ca/generar.sh"] volumes: - certs:/certs - ./ca:/opt/ca:ro networks: - tls_interna restart: "no" # --- el mismo sitio, en claro ----------------------------- web-http: image: nginx:1.27-alpine container_name: labnettls-web-http ports: - "127.0.0.1:8093:80" volumes: - ./conf/http.conf:/etc/nginx/conf.d/default.conf:ro - ./sitio:/usr/share/nginx/html:ro networks: - tls_borde - tls_interna restart: unless-stopped # --- el mismo sitio, cifrado y autenticado ---------------- # depends_on con service_completed_successfully evita el error # clasico: nginx arrancando antes de que exista el certificado. web-tls: image: nginx:1.27-alpine container_name: labnettls-web-tls ports: - "127.0.0.1:8443:443" volumes: - ./conf/tls.conf:/etc/nginx/conf.d/default.conf:ro - ./sitio:/usr/share/nginx/html:ro - certs:/certs:ro depends_on: ca: condition: service_completed_successfully networks: - tls_borde - tls_interna restart: unless-stopped # --- puesto de trabajo ------------------------------------ # Tiene openssl y curl, y monta los certificados en solo # lectura para poder verificar la cadena a mano. cliente: build: ./herramientas image: labnettls-herramientas container_name: labnettls-cliente command: ["sleep", "infinity"] volumes: - certs:/certs:ro depends_on: ca: condition: service_completed_successfully networks: - tls_interna restart: unless-stopped