"feat: Add SSL certificate generation scripts for installation"

This commit is contained in:
Till Tomczak 2025-05-26 08:00:39 +02:00
parent bb10247c41
commit 49faea0a73
5 changed files with 324 additions and 6 deletions

1
INSTALLATION.md Normal file
View File

@ -0,0 +1 @@

124
generate_ssl_certs.ps1 Normal file
View File

@ -0,0 +1,124 @@
# MYP - SSL-Zertifikat-Generator für Windows
# Erstellt selbstsignierte Zertifikate für die HTTPS-Kommunikation
# Überprüfen, ob das Skript als Administrator ausgeführt wird
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Write-Host "Dieses Skript muss mit Administrator-Rechten ausgeführt werden." -ForegroundColor Red
Write-Host "Bitte starten Sie PowerShell als Administrator und führen Sie das Skript erneut aus." -ForegroundColor Yellow
Exit 1
}
# Header anzeigen
Write-Host "================================================================" -ForegroundColor Blue
Write-Host " MYP - SSL-Zertifikat-Generator " -ForegroundColor Blue
Write-Host "================================================================" -ForegroundColor Blue
Write-Host ""
# Parameter definieren
$certDir = "./backend/instance/ssl"
$backendCertFile = "$certDir/myp.crt"
$backendKeyFile = "$certDir/myp.key"
$frontendCertFile = "$certDir/frontend.crt"
$frontendKeyFile = "$certDir/frontend.key"
$backendHostname = "raspberrypi"
$frontendHostname = "m040tbaraspi001.de040.corpintra.net"
$validityDays = 3650 # 10 Jahre
# Verzeichnis erstellen, falls es nicht existiert
if (!(Test-Path $certDir)) {
Write-Host "Erstelle Verzeichnis $certDir..." -ForegroundColor Yellow
New-Item -ItemType Directory -Path $certDir -Force | Out-Null
}
# Prüfen, ob OpenSSL installiert ist
$openSSLInstalled = $null
try {
$openSSLInstalled = Get-Command openssl -ErrorAction SilentlyContinue
} catch {}
if ($null -eq $openSSLInstalled) {
Write-Host "OpenSSL konnte nicht gefunden werden!" -ForegroundColor Red
Write-Host "Bitte installieren Sie OpenSSL für Windows und stellen Sie sicher, dass es im PATH verfügbar ist." -ForegroundColor Yellow
Write-Host "Sie können OpenSSL von https://slproweb.com/products/Win32OpenSSL.html herunterladen." -ForegroundColor Yellow
Exit 1
}
# Funktion zum Erstellen eines selbstsignierten Zertifikats
function Create-SelfSignedCert {
param(
[string]$CertFile,
[string]$KeyFile,
[string]$Hostname,
[int]$Days
)
Write-Host "Erstelle selbstsigniertes SSL-Zertifikat für $Hostname..." -ForegroundColor Green
# OpenSSL-Konfiguration erstellen
$configFile = "$certDir/openssl_$($Hostname.Split('.')[0]).cnf"
$configContent = @"
[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
"@
$configContent | Out-File -FilePath $configFile -Encoding ASCII
# Zertifikat erstellen
openssl req -x509 -nodes -days $Days -newkey rsa:2048 -keyout $KeyFile -out $CertFile -config $configFile
# Berechtigungen setzen
if (Test-Path $KeyFile) {
# Schlüsseldatei auf 'Nur-Lesen' setzen
Set-ItemProperty -Path $KeyFile -Name IsReadOnly -Value $true
}
# Fingerprint anzeigen
$fingerprint = openssl x509 -noout -fingerprint -sha256 -in $CertFile
Write-Host "Zertifikat erstellt: $CertFile" -ForegroundColor Green
Write-Host "Fingerprint: $fingerprint" -ForegroundColor Yellow
Write-Host ""
}
# Backend-Zertifikat erstellen
Create-SelfSignedCert -CertFile $backendCertFile -KeyFile $backendKeyFile -Hostname $backendHostname -Days $validityDays
# Frontend-Zertifikat erstellen
Create-SelfSignedCert -CertFile $frontendCertFile -KeyFile $frontendKeyFile -Hostname $frontendHostname -Days $validityDays
# Bestätigung und Hinweise
Write-Host "SSL-Zertifikate wurden erfolgreich erstellt!" -ForegroundColor Green
Write-Host ""
Write-Host "Backend-Zertifikat: $backendCertFile" -ForegroundColor Cyan
Write-Host "Frontend-Zertifikat: $frontendCertFile" -ForegroundColor Cyan
Write-Host ""
Write-Host "Hinweise zur Verwendung:" -ForegroundColor Yellow
Write-Host "1. Stellen Sie sicher, dass die Zertifikatpfade in den Konfigurationsdateien korrekt sind." -ForegroundColor White
Write-Host "2. Beim ersten Zugriff auf die Anwendung müssen Sie das Zertifikat im Browser akzeptieren." -ForegroundColor White
Write-Host "3. In einer Produktionsumgebung sollten Sie offiziell signierte Zertifikate verwenden." -ForegroundColor White
Write-Host ""
Write-Host "Starten Sie die Anwendung mit:" -ForegroundColor Blue
Write-Host "docker-compose up -d" -ForegroundColor White

193
generate_ssl_certs.sh Normal file
View File

@ -0,0 +1,193 @@
#!/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"

View File

@ -29,7 +29,7 @@ Write-Host "Hosts-Datei: $hostsFile" -ForegroundColor Cyan
# Prüfen, ob die Einträge bereits existieren
$frontendEntry = Select-String -Path $hostsFile -Pattern "m040tbaraspi001.de040.corpintra.net" -Quiet
$backendEntry = Select-String -Path $hostsFile -Pattern "raaspberry" -Quiet
$backendEntry = Select-String -Path $hostsFile -Pattern "raspberrypi" -Quiet
# Einträge in die Hosts-Datei schreiben
Write-Host "Aktualisiere Hosts-Datei..." -ForegroundColor Blue
@ -48,7 +48,7 @@ if (-not $frontendEntry) {
if (-not $backendEntry) {
$hostsContent += ""
$hostsContent += "# MYP Backend Host"
$hostsContent += "$localIP raaspberry"
$hostsContent += "$localIP raspberrypi"
Write-Host "Backend-Hostname hinzugefügt" -ForegroundColor Green
} else {
Write-Host "Backend-Hostname ist bereits konfiguriert" -ForegroundColor Yellow
@ -66,7 +66,7 @@ try {
Write-Host "Folgende Hostnamen sind jetzt konfiguriert:" -ForegroundColor Blue
Write-Host " - Frontend: m040tbaraspi001.de040.corpintra.net" -ForegroundColor Yellow
Write-Host " - Backend: raaspberry" -ForegroundColor Yellow
Write-Host " - Backend: raspberrypi" -ForegroundColor Yellow
Write-Host ""
Write-Host "Sie können nun die Anwendung mit folgendem Befehl starten:" -ForegroundColor Blue
Write-Host "docker-compose up -d" -ForegroundColor Yellow

View File

@ -38,7 +38,7 @@ fi
# Prüfen, ob die Einträge bereits existieren
FRONTEND_ENTRY=$(grep -c "m040tbaraspi001.de040.corpintra.net" ${HOSTS_FILE})
BACKEND_ENTRY=$(grep -c "raaspberry" ${HOSTS_FILE})
BACKEND_ENTRY=$(grep -c "raspberrypi" ${HOSTS_FILE})
# Einträge in die Hosts-Datei schreiben
echo -e "${BLUE}Aktualisiere Hosts-Datei...${RESET}"
@ -53,7 +53,7 @@ fi
if [ $BACKEND_ENTRY -eq 0 ]; then
echo -e "\n# MYP Backend Host" >> ${HOSTS_FILE}
echo "${LOCAL_IP} raaspberry" >> ${HOSTS_FILE}
echo "${LOCAL_IP} raspberrypi" >> ${HOSTS_FILE}
echo -e "${GREEN}Backend-Hostname hinzugefügt${RESET}"
else
echo -e "${YELLOW}Backend-Hostname ist bereits konfiguriert${RESET}"
@ -63,7 +63,7 @@ echo ""
echo -e "${GREEN}Konfiguration abgeschlossen!${RESET}"
echo -e "${BLUE}Folgende Hostnamen sind jetzt konfiguriert:${RESET}"
echo -e " - Frontend: ${YELLOW}m040tbaraspi001.de040.corpintra.net${RESET}"
echo -e " - Backend: ${YELLOW}raaspberry${RESET}"
echo -e " - Backend: ${YELLOW}raspberrypi${RESET}"
echo ""
echo -e "${BLUE}Sie können nun die Anwendung mit folgendem Befehl starten:${RESET}"
echo -e "${YELLOW}docker-compose up -d${RESET}"