#!/usr/bin/env bash set -euo pipefail if [ $# -lt 2 ]; then echo "Usage: $0 [docker-run-arg ...]" >&2 exit 1 fi IMAGE="$1" TLS_APP_DIR="$2" shift 2 || true DOCKER_ARGS=("$@") SMOKE_DLL=/tls/TlsSmoke.dll PUBLIC_URL="https://example.com" LOCAL_PORT=9443 run_smoke() { local url="$1" shift docker run --rm \ -v "${TLS_APP_DIR}:/tls:ro" \ "${DOCKER_ARGS[@]}" \ "$@" \ "$IMAGE" \ dotnet "$SMOKE_DLL" "$url" } run_public_test() { echo "[CA] Validating public trust store against ${PUBLIC_URL}" >&2 run_smoke "$PUBLIC_URL" } start_local_ca_server() { CERT_WORKDIR=$(mktemp -d) openssl req -x509 -newkey rsa:2048 -days 2 -nodes -keyout "$CERT_WORKDIR/ca.key" -out "$CERT_WORKDIR/ca.crt" -subj "/CN=ElsaTestCA" >/dev/null 2>&1 openssl req -newkey rsa:2048 -nodes -keyout "$CERT_WORKDIR/server.key" -out "$CERT_WORKDIR/server.csr" -subj "/CN=host.docker.internal" >/dev/null 2>&1 cat < "$CERT_WORKDIR/server.ext" subjectAltName = DNS:localhost,DNS:host.docker.internal,IP:127.0.0.1 extendedKeyUsage = serverAuth keyUsage = digitalSignature, keyEncipherment CERTEXT openssl x509 -req -in "$CERT_WORKDIR/server.csr" -CA "$CERT_WORKDIR/ca.crt" -CAkey "$CERT_WORKDIR/ca.key" -CAcreateserial -out "$CERT_WORKDIR/server.crt" -days 2 -sha256 -extfile "$CERT_WORKDIR/server.ext" >/dev/null 2>&1 openssl s_server -quiet -accept "$LOCAL_PORT" -www -cert "$CERT_WORKDIR/server.crt" -key "$CERT_WORKDIR/server.key" >/dev/null 2>&1 & SERVER_PID=$! for _ in {1..20}; do if nc -z localhost "$LOCAL_PORT" >/dev/null 2>&1; then break fi sleep 0.2 done } cleanup_local_ca_server() { if [ -n "${SERVER_PID:-}" ]; then kill "$SERVER_PID" >/dev/null 2>&1 || true wait "$SERVER_PID" 2>/dev/null || true SERVER_PID= fi if [ -n "${CERT_WORKDIR:-}" ]; then rm -rf "$CERT_WORKDIR" CERT_WORKDIR= fi } run_extra_ca_test() { start_local_ca_server trap cleanup_local_ca_server EXIT echo "[CA] Validating EXTRA_CA_CERT flow against local CA" >&2 run_smoke "https://host.docker.internal:${LOCAL_PORT}" \ --add-host host.docker.internal:host-gateway \ -v "${CERT_WORKDIR}:/certs:ro" \ -e EXTRA_CA_CERT=/certs/ca.crt echo "[CA] Validating SSL_CERT_FILE fallback" >&2 run_smoke "https://host.docker.internal:${LOCAL_PORT}" \ --add-host host.docker.internal:host-gateway \ -v "${CERT_WORKDIR}:/certs:ro" \ -e SSL_CERT_FILE=/certs/ca.crt mkdir -p "$CERT_WORKDIR/dir" cp "$CERT_WORKDIR/ca.crt" "$CERT_WORKDIR/dir/custom-ca.crt" openssl rehash "$CERT_WORKDIR/dir" >/dev/null 2>&1 echo "[CA] Validating SSL_CERT_DIR fallback" >&2 run_smoke "https://host.docker.internal:${LOCAL_PORT}" \ --add-host host.docker.internal:host-gateway \ -v "${CERT_WORKDIR}:/certs:ro" \ -e SSL_CERT_DIR=/certs/dir cleanup_local_ca_server trap - EXIT } run_public_test run_extra_ca_test