#!/bin/bash # MYP SSL Browser-Kompatibilitäts-Fix für Raspberry Pi # Löst ERR_SSL_KEY_USAGE_INCOMPATIBLE Fehler auf Linux-Zielsystem set -e # Beende bei Fehler # Farbcodes für Output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color echo -e "${CYAN}=========================================================${NC}" echo -e "${CYAN}MYP SSL BROWSER-KOMPATIBILITÄTS-FIX für Raspberry Pi${NC}" echo -e "${CYAN}Löst ERR_SSL_KEY_USAGE_INCOMPATIBLE Fehler${NC}" echo -e "${CYAN}=========================================================${NC}" echo "" # Aktuelles Verzeichnis und Pfade SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" APP_DIR="/opt/myp" SSL_DIR="$APP_DIR/ssl" CERT_PATH="$SSL_DIR/cert.pem" KEY_PATH="$SSL_DIR/key.pem" echo -e "${BLUE}📁 Arbeitsverzeichnis: $SCRIPT_DIR${NC}" echo -e "${BLUE}📁 App-Verzeichnis: $APP_DIR${NC}" echo -e "${BLUE}🔐 SSL-Verzeichnis: $SSL_DIR${NC}" echo "" # Prüfe ob als root/sudo ausgeführt wird if [[ $EUID -ne 0 ]]; then echo -e "${RED}❌ Dieses Skript muss als root ausgeführt werden!${NC}" echo -e "${YELLOW}💡 Verwende: sudo $0${NC}" exit 1 fi # Prüfe ob OpenSSL verfügbar ist if ! command -v openssl &> /dev/null; then echo -e "${RED}❌ OpenSSL ist nicht installiert!${NC}" echo -e "${YELLOW}📦 Installiere OpenSSL...${NC}" apt update && apt install -y openssl if ! command -v openssl &> /dev/null; then echo -e "${RED}❌ OpenSSL Installation fehlgeschlagen!${NC}" exit 1 fi echo -e "${GREEN}✅ OpenSSL erfolgreich installiert${NC}" fi # SSL-Verzeichnis erstellen echo -e "${YELLOW}📁 Erstelle SSL-Verzeichnis...${NC}" mkdir -p "$SSL_DIR" mkdir -p "$SSL_DIR/backup" # Backup existierender Zertifikate if [ -f "$CERT_PATH" ]; then TIMESTAMP=$(date +"%Y%m%d_%H%M%S") echo -e "${YELLOW}💾 Erstelle Backup der alten Zertifikate...${NC}" cp "$CERT_PATH" "$SSL_DIR/backup/cert_backup_$TIMESTAMP.pem" 2>/dev/null || true cp "$KEY_PATH" "$SSL_DIR/backup/key_backup_$TIMESTAMP.pem" 2>/dev/null || true echo -e "${GREEN}✅ Backup erstellt: $SSL_DIR/backup/cert_backup_$TIMESTAMP.pem${NC}" fi # Erstelle Raspberry Pi spezifische OpenSSL-Konfiguration echo -e "${YELLOW}📝 Erstelle browser-kompatible OpenSSL-Konfiguration...${NC}" cat > "$SSL_DIR/openssl_raspberry_fix.conf" << 'EOF' [req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] C = DE ST = Baden-Wuerttemberg L = Stuttgart O = Mercedes-Benz AG OU = MYP Druckerverwaltung CN = m040tbaraspi001 [v3_req] # Basic Constraints - KRITISCH für Browser-Kompatibilität basicConstraints = critical, CA:FALSE # Key Usage - KRITISCH für ERR_SSL_KEY_USAGE_INCOMPATIBLE Fix keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement # Extended Key Usage - TLS Server Authentication extendedKeyUsage = critical, serverAuth, clientAuth # Subject Alternative Names - Alle Raspberry Pi Domains/IPs subjectAltName = critical, @alt_names # Netscape Extensions für Legacy-Browser nsCertType = server nsComment = "MYP Raspberry Pi SSL Fix - ERR_SSL_KEY_USAGE_INCOMPATIBLE Lösung" [alt_names] # Lokale Entwicklung DNS.1 = localhost DNS.2 = *.localhost IP.1 = 127.0.0.1 IP.2 = ::1 # Raspberry Pi Hostname DNS.3 = m040tbaraspi001 DNS.4 = m040tbaraspi001.local DNS.5 = raspberrypi DNS.6 = raspberrypi.local # Intranet-Domain DNS.7 = m040tbaraspi001.de040.corpintra.net DNS.8 = *.de040.corpintra.net # Raspberry Pi typische IPs IP.3 = 0.0.0.0 IP.4 = 192.168.1.0/24 IP.5 = 10.0.0.0/8 EOF echo -e "${GREEN}✅ OpenSSL-Konfiguration erstellt${NC}" # Generiere Private Key echo -e "${YELLOW}🔑 Generiere Private Key (RSA 2048)...${NC}" openssl genrsa -out "$KEY_PATH" 2048 if [ $? -eq 0 ]; then echo -e "${GREEN}✅ Private Key generiert${NC}" else echo -e "${RED}❌ Private Key Generierung fehlgeschlagen!${NC}" exit 1 fi # Generiere browser-kompatibles Zertifikat echo -e "${YELLOW}📜 Generiere browser-kompatibles Zertifikat...${NC}" openssl req -new -x509 \ -key "$KEY_PATH" \ -out "$CERT_PATH" \ -days 365 \ -config "$SSL_DIR/openssl_raspberry_fix.conf" \ -extensions v3_req \ -sha256 if [ $? -eq 0 ]; then echo -e "${GREEN}✅ Browser-kompatibles Zertifikat generiert${NC}" else echo -e "${RED}❌ Zertifikat-Generierung fehlgeschlagen!${NC}" exit 1 fi # Berechtigungen setzen echo -e "${YELLOW}🔒 Setze korrekte Berechtigungen...${NC}" chown root:root "$CERT_PATH" "$KEY_PATH" chmod 644 "$CERT_PATH" # Alle können lesen chmod 600 "$KEY_PATH" # Nur root kann lesen echo -e "${GREEN}✅ Berechtigungen gesetzt${NC}" # Aufräumen rm -f "$SSL_DIR/openssl_raspberry_fix.conf" # Validierung der Browser-Kompatibilität echo "" echo -e "${CYAN}=========================================================${NC}" echo -e "${CYAN}🔍 BROWSER-KOMPATIBILITÄTS-VALIDIERUNG${NC}" echo -e "${CYAN}=========================================================${NC}" echo -e "${YELLOW}Prüfe Zertifikat-Extensions...${NC}" # Extrahiere Zertifikat-Informationen CERT_INFO=$(openssl x509 -in "$CERT_PATH" -noout -text 2>/dev/null) # Browser-Kompatibilitäts-Checks declare -A checks=( ["Digital Signature"]="Digital Signature" ["Key Encipherment"]="Key Encipherment" ["Key Agreement"]="Key Agreement" ["TLS Web Server Authentication"]="TLS Web Server Authentication" ["Subject Alternative Name"]="Subject Alternative Name" ["CA:FALSE"]="CA:FALSE" ["SHA-256 Signature"]="sha256WithRSAEncryption" ) all_passed=true for check_name in "${!checks[@]}"; do pattern="${checks[$check_name]}" if echo "$CERT_INFO" | grep -q "$pattern"; then echo -e " ${GREEN}✅ $check_name${NC}" else echo -e " ${RED}❌ $check_name${NC}" all_passed=false fi done # Zusätzliche Raspberry Pi spezifische Checks echo "" echo -e "${YELLOW}Prüfe Raspberry Pi spezifische Konfiguration...${NC}" # Hostname Check if echo "$CERT_INFO" | grep -q "m040tbaraspi001"; then echo -e " ${GREEN}✅ Raspberry Pi Hostname (m040tbaraspi001)${NC}" else echo -e " ${RED}❌ Raspberry Pi Hostname fehlt${NC}" fi # Localhost Check if echo "$CERT_INFO" | grep -q "localhost"; then echo -e " ${GREEN}✅ Localhost Support${NC}" else echo -e " ${RED}❌ Localhost Support fehlt${NC}" fi # Intranet Domain Check if echo "$CERT_INFO" | grep -q "de040.corpintra.net"; then echo -e " ${GREEN}✅ Intranet Domain Support${NC}" else echo -e " ${YELLOW}⚠️ Intranet Domain möglicherweise nicht verfügbar${NC}" fi # Zertifikat-Details anzeigen echo "" echo -e "${BLUE}📋 Zertifikat-Details:${NC}" openssl x509 -in "$CERT_PATH" -noout -subject -dates # Systemd Service Integration echo "" echo -e "${YELLOW}🔄 Integriere mit MYP Services...${NC}" # Prüfe ob MYP App Service existiert if systemctl list-units --type=service | grep -q "myp-app"; then echo -e "${BLUE}🔄 Starte MYP App Service neu...${NC}" systemctl restart myp-app.service echo -e "${GREEN}✅ MYP App Service neu gestartet${NC}" fi # Prüfe ob MYP Kiosk Service existiert if systemctl list-units --type=service | grep -q "myp-kiosk"; then echo -e "${BLUE}🔄 Starte MYP Kiosk Service neu...${NC}" systemctl restart myp-kiosk.service echo -e "${GREEN}✅ MYP Kiosk Service neu gestartet${NC}" fi # Abschlussbericht echo "" if [ "$all_passed" = true ]; then echo -e "${GREEN}=========================================================${NC}" echo -e "${GREEN}🎉 SSL-FIX ERFOLGREICH ABGESCHLOSSEN!${NC}" echo -e "${GREEN}=========================================================${NC}" else echo -e "${YELLOW}=========================================================${NC}" echo -e "${YELLOW}⚠️ SSL-FIX ABGESCHLOSSEN (mit Warnungen)${NC}" echo -e "${YELLOW}=========================================================${NC}" fi echo "" echo -e "${CYAN}📊 ERGEBNIS:${NC}" echo -e " 📄 Zertifikat: $CERT_PATH" echo -e " 🔑 Private Key: $KEY_PATH" echo -e " 📅 Gültig bis: $(date -d '+365 days' '+%Y-%m-%d')" echo "" echo -e "${CYAN}🌐 NÄCHSTE SCHRITTE:${NC}" echo -e "${BLUE}1. Browser-Cache auf CLIENT-SYSTEM leeren:${NC}" echo -e " • Chrome/Edge: Strg+Shift+Del → 'Gesamte Zeit' → alle Optionen" echo -e " • Firefox: Strg+Shift+Del → 'Alles' auswählen" echo "" echo -e "${BLUE}2. Zugriff testen:${NC}" echo -e " • Lokal: https://localhost:5000" echo -e " • Intranet: https://m040tbaraspi001.de040.corpintra.net" echo "" echo -e "${BLUE}3. Bei SSL-Warnung im Browser:${NC}" echo -e " • 'Erweitert' → 'Weiter zu [hostname] (unsicher)'" echo "" echo -e "${GREEN}💡 Der Fehler ERR_SSL_KEY_USAGE_INCOMPATIBLE sollte behoben sein!${NC}" echo "" # System-Info für Debugging echo -e "${BLUE}🔍 System-Informationen:${NC}" echo -e " 📟 Hostname: $(hostname)" echo -e " 🌐 IP-Adressen: $(hostname -I | tr ' ' '\n' | head -3 | tr '\n' ' ')" echo -e " 🐧 OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)" echo -e " 🔐 OpenSSL: $(openssl version)" echo "" # Firewall-Check if command -v ufw &> /dev/null; then echo -e "${YELLOW}🔥 Prüfe Firewall (UFW)...${NC}" ufw_status=$(ufw status | grep "Status:") if echo "$ufw_status" | grep -q "active"; then echo -e " 🔥 UFW aktiv - prüfe HTTPS Port 443..." if ufw status | grep -q "443"; then echo -e " ${GREEN}✅ Port 443 (HTTPS) ist geöffnet${NC}" else echo -e " ${YELLOW}⚠️ Port 443 (HTTPS) möglicherweise blockiert${NC}" echo -e " 💡 Öffne mit: sudo ufw allow 443" fi else echo -e " ${GREEN}✅ UFW inaktiv - keine Firewall-Blockierung${NC}" fi fi echo -e "${GREEN}🏁 SSL-Fix für Raspberry Pi abgeschlossen!${NC}"