#!/bin/bash # MYP - SSL-Zertifikat-Generator für Linux/Unix # Erstellt selbstsignierte Zertifikate für die HTTPS-Kommunikation # Fehlerabbruch aktivieren set -e # Farben für bessere Lesbarkeit RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Funktion für Titel print_header() { echo -e "${BLUE}================================================================${NC}" echo -e "${BLUE} MYP - SSL-Zertifikat-Generator ${NC}" echo -e "${BLUE}================================================================${NC}" echo "" } # Parameter definieren CERT_DIR="./backend/instance/ssl" BACKEND_CERT_FILE="$CERT_DIR/myp.crt" BACKEND_KEY_FILE="$CERT_DIR/myp.key" FRONTEND_CERT_FILE="$CERT_DIR/frontend.crt" FRONTEND_KEY_FILE="$CERT_DIR/frontend.key" BACKEND_HOSTNAME="raspberrypi" FRONTEND_HOSTNAME="m040tbaraspi001.de040.corpintra.net" DAYS_VALID=3650 # 10 Jahre # Hilfe-Funktion show_help() { echo "Verwendung: $0 [Optionen]" echo "" echo "Optionen:" echo " -d, --dir DIR Verzeichnis für Zertifikate (Standard: $CERT_DIR)" echo " --backend-host NAME Hostname für das Backend-Zertifikat (Standard: $BACKEND_HOSTNAME)" echo " --frontend-host NAME Hostname für das Frontend-Zertifikat (Standard: $FRONTEND_HOSTNAME)" echo " -v, --valid TAGE Gültigkeitsdauer in Tagen (Standard: $DAYS_VALID)" echo " --help Diese Hilfe anzeigen" echo "" } # Argumente verarbeiten while [[ $# -gt 0 ]]; do case $1 in -d|--dir) CERT_DIR="$2" BACKEND_CERT_FILE="$CERT_DIR/myp.crt" BACKEND_KEY_FILE="$CERT_DIR/myp.key" FRONTEND_CERT_FILE="$CERT_DIR/frontend.crt" FRONTEND_KEY_FILE="$CERT_DIR/frontend.key" shift 2 ;; --backend-host) BACKEND_HOSTNAME="$2" shift 2 ;; --frontend-host) FRONTEND_HOSTNAME="$2" shift 2 ;; -v|--valid) DAYS_VALID="$2" shift 2 ;; --help) show_help exit 0 ;; *) echo -e "${RED}Unbekannte Option: $1${NC}" show_help exit 1 ;; esac done # Header anzeigen print_header # Überprüfen, ob das Skript mit Root-Rechten ausgeführt wird if [ "$EUID" -ne 0 ] && [ -n "$(which sudo)" ]; then echo -e "${YELLOW}Dieses Skript sollte idealerweise mit Root-Rechten ausgeführt werden.${NC}" echo -e "${YELLOW}Fahre trotzdem fort, aber es könnten Berechtigungsprobleme auftreten.${NC}" echo "" fi # Verzeichnis erstellen, falls es nicht existiert if [ ! -d "$CERT_DIR" ]; then echo -e "${YELLOW}Erstelle Verzeichnis $CERT_DIR...${NC}" mkdir -p "$CERT_DIR" fi # Überprüfen, ob openssl installiert ist if ! command -v openssl &> /dev/null; then echo -e "${RED}OpenSSL ist nicht installiert!${NC}" echo -e "${YELLOW}Installiere OpenSSL...${NC}" # Paketmanager erkennen und OpenSSL installieren if command -v apt-get &> /dev/null; then sudo apt-get update && sudo apt-get install -y openssl elif command -v yum &> /dev/null; then sudo yum install -y openssl elif command -v dnf &> /dev/null; then sudo dnf install -y openssl elif command -v pacman &> /dev/null; then sudo pacman -S --noconfirm openssl elif command -v zypper &> /dev/null; then sudo zypper install -y openssl else echo -e "${RED}Konnte keinen bekannten Paketmanager finden. Bitte installieren Sie OpenSSL manuell.${NC}" exit 1 fi fi # Funktion zum Erstellen eines selbstsignierten Zertifikats create_self_signed_cert() { local cert_file=$1 local key_file=$2 local hostname=$3 local days=$4 echo -e "${GREEN}Erstelle selbstsigniertes SSL-Zertifikat für $hostname...${NC}" # OpenSSL-Konfiguration erstellen local config_file="$CERT_DIR/openssl_$(echo $hostname | cut -d'.' -f1).cnf" cat > "$config_file" << EOF [req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = req_distinguished_name x509_extensions = v3_req [req_distinguished_name] C = DE ST = Berlin L = Berlin O = Mercedes-Benz AG OU = Werk 040 Berlin CN = $hostname [v3_req] keyUsage = critical, digitalSignature, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = $hostname DNS.2 = localhost IP.1 = 127.0.0.1 EOF # Zertifikat erstellen openssl req -x509 -nodes -days "$days" -newkey rsa:2048 \ -keyout "$key_file" -out "$cert_file" \ -config "$config_file" # Berechtigungen setzen chmod 600 "$key_file" chmod 644 "$cert_file" # Fingerprint anzeigen local fingerprint=$(openssl x509 -noout -fingerprint -sha256 -in "$cert_file") echo -e "${GREEN}Zertifikat erstellt: $cert_file${NC}" echo -e "${YELLOW}Fingerprint: $fingerprint${NC}" echo "" } # Backend-Zertifikat erstellen create_self_signed_cert "$BACKEND_CERT_FILE" "$BACKEND_KEY_FILE" "$BACKEND_HOSTNAME" "$DAYS_VALID" # Frontend-Zertifikat erstellen create_self_signed_cert "$FRONTEND_CERT_FILE" "$FRONTEND_KEY_FILE" "$FRONTEND_HOSTNAME" "$DAYS_VALID" # Bestätigung und Hinweise echo -e "${GREEN}SSL-Zertifikate wurden erfolgreich erstellt!${NC}" echo "" echo -e "${CYAN}Backend-Zertifikat: $BACKEND_CERT_FILE${NC}" echo -e "${CYAN}Frontend-Zertifikat: $FRONTEND_CERT_FILE${NC}" echo "" echo -e "${YELLOW}Hinweise zur Verwendung:${NC}" echo "1. Stellen Sie sicher, dass die Zertifikatpfade in den Konfigurationsdateien korrekt sind." echo "2. Beim ersten Zugriff auf die Anwendung müssen Sie das Zertifikat im Browser akzeptieren." echo "3. In einer Produktionsumgebung sollten Sie offiziell signierte Zertifikate verwenden." echo "" echo -e "${BLUE}Starten Sie die Anwendung mit:${NC}" echo "docker-compose up -d"