193 lines
5.9 KiB
Bash
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" |