#!/bin/bash # setup-registry-client.sh # Script per configurare un client Docker per accedere a un registry con certificato self-signed set -e REGISTRY_IP=${1:-"192.168.1.204"} REGISTRY_PORT=${2:-5000} CERT_SOURCE=${3} # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' print_success() { echo -e "${GREEN}✓ $1${NC}"; } print_error() { echo -e "${RED}✗ $1${NC}"; } print_info() { echo -e "${BLUE}ℹ $1${NC}"; } print_warning() { echo -e "${YELLOW}⚠ $1${NC}"; } if [ "$#" -lt 1 ]; then echo "Uso: $0 [port] [cert_file]" echo "" echo "Parametri:" echo " registry_ip - IP del registry (es: 192.168.1.204)" echo " port - Porta del registry (default: 5000)" echo " cert_file - File certificato (opzionale, verrà scaricato se non specificato)" echo "" echo "Esempi:" echo " $0 192.168.1.204" echo " $0 192.168.1.204 5000" echo " $0 192.168.1.204 5000 /path/to/domain.crt" exit 1 fi REGISTRY_URL="$REGISTRY_IP:$REGISTRY_PORT" DOCKER_CERTS_DIR="/etc/docker/certs.d/$REGISTRY_URL" print_info "Configurazione client Docker per registry: $REGISTRY_URL" echo "" # Verifica se Docker è installato if ! command -v docker &> /dev/null; then print_error "Docker non trovato. Installalo prima di continuare." exit 1 fi # Crea directory per i certificati Docker print_info "Creazione directory certificati Docker..." sudo mkdir -p "$DOCKER_CERTS_DIR" print_success "Directory creata: $DOCKER_CERTS_DIR" # Scarica o copia il certificato if [ -z "$CERT_SOURCE" ]; then print_info "Scaricamento certificato dal registry..." # Tenta di scaricare il certificato usando openssl if timeout 5 openssl s_client -showcerts -connect "$REGISTRY_URL" /dev/null | \ openssl x509 -outform PEM > /tmp/registry-cert.pem 2>/dev/null; then sudo mv /tmp/registry-cert.pem "$DOCKER_CERTS_DIR/ca.crt" print_success "Certificato scaricato con successo" else print_error "Impossibile scaricare il certificato automaticamente" print_warning "Opzioni:" print_info " 1. Copia manualmente il certificato dal registry:" print_info " scp root@$REGISTRY_IP:/opt/docker-registry/certs/domain.crt /tmp/registry.crt" print_info " sudo cp /tmp/registry.crt $DOCKER_CERTS_DIR/ca.crt" print_info "" print_info " 2. Riavvia questo script specificando il file certificato:" print_info " $0 $REGISTRY_IP $REGISTRY_PORT /path/to/cert.crt" exit 1 fi else if [ ! -f "$CERT_SOURCE" ]; then print_error "File certificato non trovato: $CERT_SOURCE" exit 1 fi print_info "Copia certificato da: $CERT_SOURCE" sudo cp "$CERT_SOURCE" "$DOCKER_CERTS_DIR/ca.crt" print_success "Certificato copiato" fi # Verifica permessi sudo chmod 644 "$DOCKER_CERTS_DIR/ca.crt" # Verifica certificato print_info "Verifica certificato installato..." if sudo openssl x509 -in "$DOCKER_CERTS_DIR/ca.crt" -text -noout > /dev/null 2>&1; then print_success "Certificato valido" print_info "Dettagli certificato:" sudo openssl x509 -in "$DOCKER_CERTS_DIR/ca.crt" -noout -subject -issuer -dates # Mostra SANs se presenti if sudo openssl x509 -in "$DOCKER_CERTS_DIR/ca.crt" -text -noout | grep -q "Subject Alternative Name"; then print_info "Subject Alternative Names:" sudo openssl x509 -in "$DOCKER_CERTS_DIR/ca.crt" -text -noout | grep -A 3 "Subject Alternative Name" else print_warning "Certificato non ha Subject Alternative Names (SANs)" print_warning "Considera di rigenerare il certificato con: ./scripts/generate-registry-cert.sh" fi else print_error "Certificato non valido" exit 1 fi # Riavvia Docker print_info "Riavvio Docker daemon..." sudo systemctl restart docker sleep 3 if sudo systemctl is-active --quiet docker; then print_success "Docker riavviato con successo" else print_error "Errore nel riavvio di Docker" exit 1 fi # Test connessione al registry echo "" print_info "Test connessione al registry..." # Test HTTPS if timeout 5 openssl s_client -connect "$REGISTRY_URL" -CAfile "$DOCKER_CERTS_DIR/ca.crt" &1 | grep -q "Verify return code: 0"; then print_success "Connessione HTTPS con verifica certificato: OK" elif timeout 5 openssl s_client -connect "$REGISTRY_URL" &1 | grep -q "CONNECTED"; then print_warning "Connessione HTTPS: OK ma verifica certificato fallita" print_info "Il certificato potrebbe essere self-signed o avere SANs non corretti" else print_error "Impossibile connettersi al registry" fi # Test Docker login echo "" print_info "Per testare Docker con il registry, esegui:" echo " docker pull $REGISTRY_URL/orchestrator-app:latest" echo "" print_info "Se il registry richiede autenticazione:" echo " docker login $REGISTRY_URL" echo "" # Opzionale: installa anche nel sistema read -p "Vuoi installare il certificato anche nel sistema per curl/wget? (y/N) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then print_info "Installazione certificato nel sistema..." sudo cp "$DOCKER_CERTS_DIR/ca.crt" /usr/local/share/ca-certificates/registry-$REGISTRY_IP.crt sudo update-ca-certificates print_success "Certificato installato nel sistema" # Test con curl if curl -I "https://$REGISTRY_URL/v2/" 2>&1 | grep -q "200 OK"; then print_success "Test curl: OK" else print_warning "Test curl fallito (normale se registry richiede autenticazione)" fi fi echo "" print_success "Setup client completato!" print_info "Il Docker daemon ora può accedere a: $REGISTRY_URL"