Projektarbeit-MYP/generate_ssl_certs.sh

193 lines
5.9 KiB
Bash

#!/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"