lab-net-tls — HTTP contra HTTPS con una CA propia ================================================= ESTADO: LABORATORIO LOCAL Target: http://localhost:8093 y https://localhost:8443 Autorizacion: sistema local creado por ti para entrenamiento. La autoridad certificadora de este laboratorio vive dentro del compose y muere con "down -v". En ningun momento se instala nada en el almacen de confianza de tu maquina: la confianza se pasa a mano con --cacert. Instalar una CA de pruebas en el sistema es como dejarse una llave puesta, y es exactamente lo que hace medio internet. Lo usa la leccion f02-tls. Que levanta ----------- ca emite la CA y el certificado del servidor, y termina web-http el sitio en claro, 127.0.0.1:8093 web-tls el mismo sitio cifrado, 127.0.0.1:8443 cliente alpine con openssl, curl y tcpdump Volumen "certs": ca.crt raiz del laboratorio servidor.crt certificado de web-tls, con SAN DNS:web-tls y DNS:localhost servidor.key clave privada del servidor Dos redes: tls_borde tiene salida; la tocan los dos servidores para publicar tls_interna internal: true, SIN salida a internet Comandos -------- docker compose up -d --build levantar y emitir certificados docker compose logs ca ver lo que emitio la CA docker compose exec cliente sh entrar al puesto de trabajo docker compose down -v destruir todo, certificados incluidos Recorrido de la leccion ----------------------- # 1. lo que viaja en claro docker compose exec -d cliente sh -c "tcpdump -i any -w /tmp/claro.pcap port 80" docker compose exec cliente curl -s http://web-http/secreto docker compose exec cliente sh -c "pkill tcpdump; strings /tmp/claro.pcap | grep -i token" # 2. lo mismo, cifrado: la cadena ya no aparece docker compose exec -d cliente sh -c "tcpdump -i any -w /tmp/cifrado.pcap port 443" docker compose exec cliente curl -s --cacert /certs/ca.crt https://web-tls/secreto docker compose exec cliente sh -c "pkill tcpdump; strings /tmp/cifrado.pcap | grep -i token; echo salida=\$?" # 3. el handshake completo, paso a paso docker compose exec cliente sh -c "echo | openssl s_client -connect web-tls:443 -servername web-tls -CAfile /certs/ca.crt 2>&1 | head -40" # 4. la cadena de confianza, sin la raiz docker compose exec cliente curl -sv https://web-tls/secreto 2>&1 | grep -i -E "certificate|verify" # 5. la bandera que apaga toda la verificacion docker compose exec cliente curl -sk https://web-tls/secreto # 6. nombre equivocado: el certificado es valido pero no para esto docker compose exec cliente curl -s --cacert /certs/ca.crt https://web-http/ ; echo salida=$? # 7. inspeccionar el certificado emitido docker compose exec cliente openssl x509 -in /certs/servidor.crt -noout -text | head -30 Si algo falla ------------- "port is already allocated" cambia 8443 por 127.0.0.1:8444:443 web-tls no arranca mira "docker compose logs ca": si la CA fallo, no hay certificado que cargar curl: (60) SSL certificate... correcto: te falta --cacert /certs/ca.crt curl: (35) handshake failure estas pidiendo https a web-http, que solo habla en claro el navegador no deja pasar es lo esperado; el laboratorio no instala la CA en tu sistema a proposito Cuando termines, siempre: docker compose down -v